【问题标题】:objective c gcd - should a cancelled operation call a compeletion handler目标 c gcd - 取消的操作是否应该调用完成处理程序
【发布时间】:2013-09-16 10:48:57
【问题描述】:

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

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

-(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);
}

【问题讨论】:

  • 包含有关作业是否实际完成的信息的完成处理程序怎么样。请参阅 UIView 动画块。有一个变量BOOL finished,它表示动画是真的完成还是被剪短了。
  • 我会推荐 NSOperation 处理后台任务和取消 (NSOperation)

标签: ios objective-c coding-style grand-central-dispatch


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多