В какой очереди должен вызываться завершениеHandler, чтобы сообщить о немедленных ошибках? - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть асинхронная функция, которая принимает completionHandler в качестве параметров.У него типичный результат и параметры ошибок.completionHandler вызывается после получения данных, загруженных из Интернета.

Существует несколько предварительных условий, при которых ошибка должна быть немедленно возвращена вызывающей стороне (например, при передаче неверного параметра запроса)..

Должны ли эти немедленные ошибки возвращаться синхронно:

public private(set) var completionQueue: DispatchQueue

public func callAsync(requestData: String, completionHandler: @escaping (result: String?, error: Error?) -> Void)
{
    if <requestData is invalid>
    {
        completionHandler(result: nil, error: MyErrors.invalidRequestData)
    }

    ...
 }

Или, если completionHandler всегда вызываться асинхронно, без исключений для ошибок, обнаруженных немедленно?

    if <requestData is invalid>
    {
        completionQueue.async
        {
            completionHandler(result: nil, error: MyErrors.invalidRequestData)
        }
    }

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

Если вы используете completionQueue только для обработчика завершения этой единственной функции, то вы можете синхронно выполнить вызов completionHandler в очереди, поскольку вы будете блокировать только дальнейшие вызовы завершения из той же функции.

Однако, если вы используете этот DispatchQueue и для чего-то еще, например, для выполнения обработчика завершения других функций, то вам не следует выполнять обработчик завершения синхронно, так как вы будете блокировать другие функцииот выполнения также.

В общем, я бы предложил асинхронно выполнять обработчики завершения и возвращаться из функции после вызова обработчика завершения в случае возникновения ошибки.Это гарантирует, что функция перестает выполняться, но вы не блокируете никакие другие методы.

0 голосов
/ 19 декабря 2018

Я бы сказал, что вызывающая функция callAsync ожидает асинхронного возврата.

Скорость , на которой это происходит, не имеет значения.Поэтому я хотел бы предложить, чтобы возвращение было асинхронным.

Затем вызывающий объект должен правильно обрабатывать возвращаемые «данные» в основном потоке или иным образом, как требуется.Я бы не хотел смешивать потоки в реализации callAsync.

...