2016-09-15 69 views
0

从另一个类访问变量时出现问题。来自另一个类的变量

我初始化和修改此变量

TheResponse类

import Foundation 
import Alamofire 

class TheResponse { 

typealias JSONStd = [[String : AnyObject]] 
var jsonAnswer = [[String:String]]() 

var getRes: [[String : String]] { 
    return jsonAnswer 
} 

func callAmo(){ 
    let urladdress = "https://api.github.com/users" 
    Alamofire.request(urladdress).responseJSON(completionHandler: { 
     response in 
     //print(response) 
     self.parseData(JSONData: response.data!) 
    }) 
} 

func parseData(JSONData : Data){ 

    do { 
     var readableJSON = try JSONSerialization.jsonObject(with: JSONData, options: .mutableContainers) as! JSONStd 
      let counter = readableJSON.count 
//Filling the dictionary 
     for item in 0...counter - 1 { 
      let login = readableJSON[item]["login"] 
      let avatar_url = readableJSON[item]["avatar_url"] 
      let html_url = readableJSON[item]["html_url"] 
      let id = String(describing: readableJSON[item]["id"]) 

      var dict:[String:AnyObject] = ["login": login!, 
         "avatar": avatar_url!, 
         "profile": html_url!, 
         "id": id as AnyObject] 

      jsonAnswer.append(dict as! [String : String]) 
     } 
    } 
    catch{ 
     print(error) 
    } 
} 
} 

如果我将打印在这里的某个地方jsonAnswer变量,一切都看起来不错。 但我想在我的第二类中使用这个变量

import UIKit 
import Alamofire 

class TableViewController: UITableViewController { 
var resObj = TheResponse() 
var jsonData = [[String:String]]() 


override func viewDidLoad() { 
    super.viewDidLoad() 

    resObj.callAmo{ (jsonAns) ->() in 
     self.jsonData = jsonAns 
     // print(self.jsonData) 
    } 
    print(self.jsonData) 

} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
} 

override func numberOfSections(in tableView: UITableView) -> Int { 
    return 1 
} 

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return 5 
} 

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "MyCell", for: indexPath) as! MainViewCell 

    return cell 
} 

} 

的问题是,当我要打印变量TableViewController类,变量为空。作为打印出来,我只得到[]。

我应该如何访问该变量才能拥有它?

+0

您的代码似乎做你写的是什么?你调用'resObj.getRes'返回'jsonAnswer = [[String:String]]()'这是空的,没有错? – Tj3n

+0

在pareJson方法中,我正在填充jsonAnswer和 'jsonAnswer.append(dict as![String:String])' – Micgal

+0

是的,但您从未调用该函数,并且您放置的是相当错误的,必须创建完成块在'callAmo()'上,不要使用数组作为存储的属性 – Tj3n

回答

0

问题是您还没有调用callAmo方法,您需要使用您的方法创建完成关闭,因此请更改您的代码。

func callAmo(completion: ([[String : String]]) ->()) { 
    let urladdress = "https://api.github.com/users" 
    Alamofire.request(urladdress).responseJSON(completionHandler: { 
     response in 
     //print(response) 
     let dic = self.parseData(JSONData: response.data!) 
     completion(dic) 
    }) 
} 

现在返回字典从parseData这样的方法。

func parseData(JSONData : Data) -> [[String: String]]{ 

    do { 
     var readableJSON = try JSONSerialization.jsonObject(with: JSONData, options: .mutableContainers) as! JSONStd 
     let counter = readableJSON.count 
     //Filling the dictionary 
     for item in 0...counter - 1 { 
      let login = readableJSON[item]["login"] 
      let avatar_url = readableJSON[item]["avatar_url"] 
      let html_url = readableJSON[item]["html_url"] 
      let id = String(describing: readableJSON[item]["id"]) 

      var dict:[String:AnyObject] = ["login": login!, 
        "avatar": avatar_url!, 
        "profile": html_url!, 
        "id": id as AnyObject] 

      jsonAnswer.append(dict as! [String : String]) 
     } 
    } 
    catch{ 
     print(error) 
    } 
    return jsonAnswer 
} 

现在的TableViewController这样viewDidLoad调用此方法。

resObj.callAmo{ (jsonAns) ->() in 
    print(jsonAns) 
} 

编辑:要获得TableViewController数据做这样

var jsonData = [[Strin:String]]() 

override func viewDidLoad() { 
    super.viewDidLoad() 

    resObj.callAmo{ (jsonAns) ->() in 
     self.jsonData = jsonAns 
     self.tableView.reloadData() 
    } 
} 

override func numberOfSections(in tableView: UITableView) -> Int { 
    return 1 
} 

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return self.jsonData.count 
} 

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "MyCell", for: indexPath) as! MainViewCell 
    return cell 
} 
+0

这就是我需要的!谢谢:) – Micgal

+0

欢迎队友:) –

+0

但还有一个问题。 如果我想在'TableViewController'中有一个'jsonAns'的副本,我可以让'resObj.callAmo {(jsonAns) - >()in let copy = jsonAns }'? – Micgal