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()
}
上一篇下一篇

猜你喜欢

热点阅读