我正在研究NSOperation对象。根据App Document (清单2-5),我们可以实现一个异步NSOperation。开始部分如下所示:
- (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函数:
[NSThread detachNewThreadSelector:@selector(main) toTarget:self withObject:nil];因此,NSOperation似乎对并发执行没有做任何事情。异步是通过创建新线程来实现的。那么为什么我们需要NSOperation呢?
发布于 2015-10-10 20:00:00
您可以使用并发NSOperation来执行异步任务。我们应该强调一个事实,异步任务的主要工作将在不同的线程上执行,而不是在调用其start方法的线程上执行。
那么,为什么这是有用的?
通过将异步任务包装到并发NSOperation中,您可以利用NSOperationQueue,而且还可以设置其他操作之间的依赖关系。
例如,将操作入队到NSOperationQueue中可以定义将并行执行多少个操作。您还可以轻松地取消整个队列,即已入队的所有操作。
NSOperationQueue还可用于将其与某些资源相关联-例如,一个队列执行受CPU限制的异步任务,另一个队列执行受IO限制的任务,还有另一个队列执行与核心数据相关的任务,等等。对于每个队列,您可以定义并发操作的最大数量。
有了依赖,你就可以实现组合。这意味着,例如,您可以定义操作C仅在操作A和B完成后执行。使用组合,您可以解决更复杂的异步问题。
就是这样,IMHO。
我想提一下,使用NSOperations有点麻烦、笨拙和冗长,这需要大量的样板代码和子类等等。不过,还有更好的替代方案,它们需要第三方库。
https://stackoverflow.com/questions/33051969
复制相似问题