从其他类访问变量时遇到问题。
我正在初始化和修改变量
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
类中打印变量时,该变量为空。打印出来时,我只得到[]。
我应该如何访问该变量以使其具有应有的效果?
答案 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
}