何时从方法返回执行队列同步任务?

时间:2018-05-27 06:55:09

标签: ios swift multithreading alamofire grand-central-dispatch

我正在浏览Alamofire的源代码,以下代码片段让我有些困惑。

    func task(session: URLSession, adapter: RequestAdapter?, queue: DispatchQueue) throws -> URLSessionTask {
        do {
            let urlRequest = try self.urlRequest.adapt(using: adapter)
            return queue.sync { session.dataTask(with: urlRequest) }
        } catch {
            throw AdaptError(error: error)
        }
    }

queue.sync { session.dataTask(with: urlRequest) }行让我感到困惑。

正如您所看到的,方法返回类型是URLSessionTask,这正是session.dataTask(with: urlRequest)返回的内容。

queue.sync {}func sync<T>(execute work: () throws -> T) rethrows -> T,在这种情况下会返回URLSessionTask

所以我的问题是session.dataTask(with: urlRequest)内的queue.sync {}到底是什么时候运行的?当方法在实际返回之前或返回的对象被使用时到达此行时是什么?

1 个答案:

答案 0 :(得分:1)

Apple的文档中对sync的描述说:

  

同步(执行:)

     

提交一个块对象以便在调度队列上执行并等待   直到该块完成。

因此关闭会立即在queue上运行。函数的返回值是sync内的闭包的返回值。