【发布时间】:2018-04-13 07:19:23
【问题描述】:
我正在使用 Alamofire 库向 stackexchange api 发出 GET 请求,我想将从 JSON 获得的结果保存在一个数组中,问题是 alamofire 任务是异步的,我需要提供的数据通过它来完成我的工作,例如插入表格单元格等...我尝试使用信号量让我的程序等待调用,但调用永远不会到达信号()。为什么会发生这种情况?在异步调用终止后继续我的工作的另一种方式是什么?我对这些东西很陌生,所以我不太了解,感谢任何帮助。代码如下:
var users:[UserInfo] = []
var number:Int = 0
let dispatch:DispatchSemaphore = DispatchSemaphore(value: 0)
override func viewDidLoad() {
tableView.delegate = self
tableView.dataSource = self
// GET the data from the stackexchange api
let param: Parameters = [
"order": "desc",
"max" : 10,
"sort" : "reputation",
"site" : "stackoverflow"
]
Alamofire.request("https://api.stackexchange.com/2.2/users", method: .get, parameters: param).responseJSON { (response) -> (Void) in
if let json = response.result.value {
// we got a result
/* I know this is a bit ugly */
let json1 = json as! [String:AnyObject]
let usersInfoFromJSON = json1["items"] as! NSArray // remember to cast it as NSDictionary
for userInfo in usersInfoFromJSON {
self.number = 70 // just for test
let userDict = userInfo as! NSDictionary
self.users.append(UserInfo(newName: userDict["display_name"] as! String,
newImageURL: userDict["profile_image"] as! String))
}
}
self.dispatch.signal()
}
self.dispatch.wait()
print(self.number) // just for test
super.viewDidLoad()
}
【问题讨论】:
-
你真的不想用 self.dispatch.wait() 阻塞主线程
-
是的,你是对的,但解决方案是什么?
-
首先,去掉 DispatchSemaphore。在 Alamofire.request 调用结束时做任何你需要做的事情。在上面的示例中,将
print(self.number)放在您当前拥有self.dispatch.signal()的位置您可能希望从那里进行调用以更新 UI、停止微调器等。 -
是的,可以,但我还有其他功能,例如 TableViewDelegate 所需的功能,需要 alamofire 调用提供的数据
-
同样的原则也适用,从闭包中调用这些函数。表视图委托只需要立即处理没有数据。一旦你有了数据,你可以调用 tableview.reloadData() 来显示它。
标签: ios swift http networking