我正在浏览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 {}
到底是什么时候运行的?当方法在实际返回之前或返回的对象被使用时到达此行时是什么?
答案 0 :(得分:1)
Apple的文档中对sync
的描述说:
同步(执行:)强>
提交一个块对象以便在调度队列上执行并等待 直到该块完成。
因此关闭会立即在queue
上运行。函数的返回值是sync
内的闭包的返回值。