我有一个异步函数,它接受一个 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/