0

许多长时间运行的异步方法都有完成处理程序块作为输入参数附加到它们

如果操作被取消,我不确定是否应该调用完成处理程序。

-(void)longRunningAsyncOperation:(Input *)input completionHandler:(Block)completionHandler
{
  // long running code

  // periodic checks for cancelation

  if(_canceled)
  {
   // should completion handler still be called?
   return;
  }

  // more long running code

  // completed
  completionHandler(someData);
}
4

3 回答 3

0

我认为这里不一定有一个“正确答案”。你应该让它做你需要做的任何事情。正如@Fogmeister 在评论中提出的那样,一种选择是让完成例程接受一个参数,指示它是被取消还是正常完成。在所有情况下都调用某些东西似乎是可取的,以便感兴趣的一方可以知道该操作已被取消。

我见过其他 API 采用两个不同的完成块——一个“成功”块和一个“失败”块。在我看来,使用参数来指示状态的单个块似乎是一种更具适应性的模式。

如果您在取消时不调用任何完成块,则实际上存在“丢失信息”;如果没有其他机制,外部世界不可能知道操作被取消,所以看起来像这些模式之一,无论是完成的参数,还是成功/失败块,都比简单地不调用任何东西更可取.

于 2013-09-16T11:45:01.107 回答
0

@ipmcc 是正确的。通常没有一个正确的答案,但最佳实践通常要求您始终调用完成块,并且如果完成块确实关心,则将其传递给成功/取消标志。这是最佳实践的原因是,可能已分配一些内存作为取消操作的前奏,如果您不调用完成处理程序,您将永远没有机会再次释放它。

于 2013-09-16T23:21:20.653 回答
0

我会说是的,它将调用完成处理程序。

这样做的理由是,可以将完成处理程序视为某种形式的返回值

因此,不调用完成处理程序就像在声明为返回某些内容的函数中不返回值。

于 2013-09-18T12:52:00.550 回答