美文网首页
iOS 小笔记 | Alamofire 与信号量配套使用的死锁问

iOS 小笔记 | Alamofire 与信号量配套使用的死锁问

作者: Lol刀妹 | 来源:发表于2020-05-09 00:30 被阅读0次
    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()
    }
    

    相关文章

      网友评论

          本文标题:iOS 小笔记 | Alamofire 与信号量配套使用的死锁问

          本文链接:https://www.haomeiwen.com/subject/tnmcnhtx.html