应该在哪个队列上调用completionHandler报告即时错误?

时间:2018-12-19 10:57:51

标签: ios swift multithreading completionhandler

我有一个异步函数,该函数以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 :(得分:2)

如果仅对单个函数的完成处理程序使用$client->__getLastRequest();,则可以在队列上同步执行<ns:helloRequest>调用,因为您将仅阻止来自同一函数的其他完成调用功能。

但是,如果您还使用completionQueue做其他事情,例如执行其他功能的完成处理程序,则您不应同步执行该完成处理程序,因为您将阻止其他也从执行开始起作用。

通常,我建议异步执行完成处理程序,并在完成处理程序调用后从函数返回,以防遇到错误。这样可以确保函数停止执行,但不会阻塞任何其他方法。

答案 1 :(得分:1)

我认为callAsync函数的调用者期望异步返回。

发生的速度无关紧要。因此,我建议返回的结果应该是异步的。

然后由调用方适当处理主线程上的返回“数据”或其他要求。我不想在callAsync实现中混用线程。