首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实现异步NSOperation

实现异步NSOperation
EN

Stack Overflow用户
提问于 2015-10-10 16:33:22
回答 1查看 449关注 0票数 2

我正在研究NSOperation对象。根据App Document (清单2-5),我们可以实现一个异步NSOperation。开始部分如下所示:

代码语言:javascript
复制
- (void)start {
   // Always check for cancellation before launching the task.
   if ([self isCancelled])
   {
      // Must move the operation to the finished state if it is canceled.
      [self willChangeValueForKey:@"isFinished"];
      finished = YES;
      [self didChangeValueForKey:@"isFinished"];
      return;
   }

   // If the operation is not canceled, begin executing the task.
   [self willChangeValueForKey:@"isExecuting"];
   [NSThread detachNewThreadSelector:@selector(main) toTarget:self withObject:nil];
   executing = YES;
   [self didChangeValueForKey:@"isExecuting"];
}

我发现分配了一个新线程来运行main函数:

代码语言:javascript
复制
[NSThread detachNewThreadSelector:@selector(main) toTarget:self withObject:nil];

因此,NSOperation似乎对并发执行没有做任何事情。异步是通过创建新线程来实现的。那么为什么我们需要NSOperation呢?

EN

回答 1

Stack Overflow用户

发布于 2015-10-10 20:00:00

您可以使用并发NSOperation来执行异步任务。我们应该强调一个事实,异步任务的主要工作将在不同的线程上执行,而不是在调用其start方法的线程上执行。

那么,为什么这是有用的?

通过将异步任务包装到并发NSOperation中,您可以利用NSOperationQueue,而且还可以设置其他操作之间的依赖关系。

例如,将操作入队到NSOperationQueue中可以定义将并行执行多少个操作。您还可以轻松地取消整个队列,即已入队的所有操作。

NSOperationQueue还可用于将其与某些资源相关联-例如,一个队列执行受CPU限制的异步任务,另一个队列执行受IO限制的任务,还有另一个队列执行与核心数据相关的任务,等等。对于每个队列,您可以定义并发操作的最大数量。

有了依赖,你就可以实现组合。这意味着,例如,您可以定义操作C仅在操作A和B完成后执行。使用组合,您可以解决更复杂的异步问题。

就是这样,IMHO。

我想提一下,使用NSOperations有点麻烦、笨拙和冗长,这需要大量的样板代码和子类等等。不过,还有更好的替代方案,它们需要第三方库。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33051969

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档