ios - 应该在什么队列上调用 completionHandler 来报告即时错误?

标签 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)
        }
    }

最佳答案

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

但是,如果您还将该 DispatchQueue 用于其他任何事情,例如用于执行其他函数的完成处理程序,那么您不应该同步执行完成处理程序,因为您将也会阻止其他功能的执行。

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

关于ios - 应该在什么队列上调用 completionHandler 来报告即时错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53849790/

相关文章:

ios - 如何在一对多核心数据关系中获取特定数据?

ios - faSTLane:从 launchtl 作业运行时找不到命令

ios - swift : deinit is not calling on back button action

java - 关于守护线程

ios - AutoLayout:多行标签和固定大小的按钮

ios - 修改使用 viewWithTag 选择的单元格元素的框架不起作用

ios - 如何使用 PKAddPassButton 添加 "Add to Apple Wallet"按钮 - swift

ios - 从另一个 View Controller 返回后如何为主 Storyboard保留大标题?

c# - VS 2017 的任务窗口中的 "Status" "Scheduled"是什么意思?

java - 在多线程 Java 应用程序中创建缓存的深拷贝