我有一个异步函数,该函数以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)
}
}
答案 0 :(得分:2)
如果仅对单个函数的完成处理程序使用$client->__getLastRequest();
,则可以在队列上同步执行<ns:helloRequest>
调用,因为您将仅阻止来自同一函数的其他完成调用功能。
但是,如果您还使用completionQueue
做其他事情,例如执行其他功能的完成处理程序,则您不应同步执行该完成处理程序,因为您将阻止其他也从执行开始起作用。
通常,我建议异步执行完成处理程序,并在完成处理程序调用后从函数返回,以防遇到错误。这样可以确保函数停止执行,但不会阻塞任何其他方法。
答案 1 :(得分:1)
我认为callAsync
函数的调用者期望异步返回。
发生的速度无关紧要。因此,我建议返回的结果应该是异步的。
然后由调用方适当处理主线程上的返回“数据”或其他要求。我不想在callAsync
实现中混用线程。