代码之家  ›  专栏  ›  技术社区  ›  Tony Lin

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

  •  1
  • Tony Lin  · 技术社区  · 7 年前

    我正在浏览源代码 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 ,在本例中返回 .

    所以我的问题是什么时候 session.datatask(带有:urlrequest) 里面 queue.sync_ 跑?方法是在实际返回之前到达此行,还是在使用返回的对象时到达此行?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Guy Kogus    7 年前

    描述 sync 在苹果的文档中说:

    同步(执行:)

    提交要在调度队列上执行的块对象并等待 直到那个街区结束。

    这样就可以立即关闭 queue . 函数的返回值是内部闭包的返回值 同步 .