iOS 小笔记 | Alamofire 与信号量配套使用的死锁问
2020-05-09 本文已影响0人
Lol刀妹
iu
-
死锁代码:
// 获取淘宝时间戳
func getTaobaoTimeStamp() -> String {
let url = URL.init(string: "http://api.m.taobao.com/rest/api3.do?api=mtop.common.getTimestamp")!
let semaphore = DispatchSemaphore(value: 0)
var t = ""
let queue = DispatchQueue.global()
queue.async {
AF.request(url).response { (response) in
switch response.result {
case .success(let jsonData):
print(Thread.current)
let dict = JSON(jsonData)
t = dict["data"]["t"].stringValue
case .failure(let info):
print(info.localizedDescription)
}
semaphore.signal()
}
}
semaphore.wait()
return t
}
-
死锁原因:
执行到semaphore.wait()
的时候,主线程卡住,等待信号,但是一辈子都等不到了。。。
因为——
completionHandler
默认在主线程。
即使把数据请求那段代码放在了子线程,依旧改变不了completionHandler
在主线程的事实。
现在主线程都卡住了,还怎么在主线程回调?
所以就这样卡死了。
-
解决方案
知道原因了解决也就简单了,指定completionHandler
在子线程即可:
let queue = DispatchQueue.global()
AF.request(url).response(queue: queue) { (response) in
switch response.result {
case .success(let jsonData):
print(Thread.current)
let dict = JSON(jsonData)
t = dict["data"]["t"].stringValue
case .failure(let info):
print(info.localizedDescription)
}
semaphore.signal()
}