以下代码来自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时,它都会将创建进程分配给一个串行队列。这个措施会保护程序免受任何类型的多线程陷阱吗?
如果没有这个队列,我无法弄清楚区别的是什么。
答案 0 :(得分:1)
我们实施该检查的原因是由于Alamofire Issue #393。在创建数据和从多个线程并行上传任务时,我们看到没有串行队列的重复任务标识符。在递增任务标识符时,Apple似乎存在线程安全问题。因此,在Alamofire中,我们通过在串行队列上创建任务来消除此问题。
干杯。