Когда выполняется задача синхронизации очереди из метода return? - PullRequest
0 голосов
/ 27 мая 2018

Я просматриваю исходный код 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 голосов
/ 27 мая 2018

Описание sync в документации Apple гласит:

sync (execute:)

Передает объект блока для выполнения в очередь отправкии ждет, пока этот блок не завершится.

Так что замыкание запускается сразу на queue.Возвращаемое значение функции - это возвращаемое значение замыкания внутри sync.

...