代码之家  ›  专栏  ›  技术社区  ›  meaning-matters

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

  •  1
  • meaning-matters  · 技术社区  · 6 年前

    我有一个异步函数,需要 completionHandler 作为参数。它具有典型的结果和误差参数。这个 completionHandler 在接收到从internet加载的数据后调用。

    有一些先决条件要求必须立即将错误返回给调用方(例如,当传递的请求参数无效时)。

    如果同步返回这些即时错误:

    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 回复  |  直到 6 年前
        1
  •  2
  •   Dávid Pásztor    6 年前

    如果你只使用 completionQueue 对于单个函数的完成处理程序,您可以执行 completionHandler 在队列上同步调用,因为您只会阻止来自同一函数的进一步完成调用。

    然而,如果你正在使用 DispatchQueue 对于其他任何事情,例如执行其他函数的完成处理程序,那么您不应该同步执行完成处理程序,因为您也会阻止其他函数的执行。

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

        2
  •  1
  •   Woodstock    6 年前

    我认为打电话的人 callAsync 函数期望异步返回。

    这个 速度 这种情况发生的时间无关紧要。因此,我建议返回应该是异步的。

    然后由调用方在主线程上或根据需要正确处理返回的“数据”。我可不想把这些线索混在一起 callAsync 实施