2016-09-15 68 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