为什么Alamofire在创建dataTask时使用dispatch_sync()函数?

时间:2016-08-04 02:49:07

标签: alamofire

以下代码来自Alamofire

的源代码
let queue = dispatch_queue_create(nil, DISPATCH_QUEUE_SERIAL)

public func request(URLRequest: URLRequestConvertible) -> Request {
    var dataTask: NSURLSessionDataTask!
    dispatch_sync(queue) { dataTask = self.session.dataTaskWithRequest(URLRequest.URLRequest) }

    let request = Request(session: session, task: dataTask)
    self.delegate[request.delegate.task] = request.delegate

    if startRequestsImmediately {
        request.resume()
    }

    return request
}

似乎每次创建dataTask时,它都会将创建进程分配给一个串行队列。这个措施会保护程序免受任何类型的多线程陷阱吗?

如果没有这个队列,我无法弄清楚区别的是什么。

1 个答案:

答案 0 :(得分:1)

我们实施该检查的原因是由于Alamofire Issue #393。在创建数据和从多个线程并行上传任务时,我们看到没有串行队列的重复任务标识符。在递增任务标识符时,Apple似乎存在线程安全问题。因此,在Alamofire中,我们通过在串行队列上创建任务来消除此问题。

干杯。