来自另一个类的变量

时间:2016-09-15 07:59:07

标签: ios swift class

从其他类访问变量时遇到问题。

我正在初始化和修改变量

TheResponse Class

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类中打印变量时,该变量为空。打印出来时,我只得到[]。

我应该如何访问该变量以使其具有应有的效果?

1 个答案:

答案 0 :(得分: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
}

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

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
}