[英]NSOperation on the iPhone
我一直在寻找一些具体的场景,以确定iPhone上的NSOperation
是否是在应用程序中使用的理想工具。 据我所知,这是编写自己的threaded
代码的包装器。 我还没有看到任何使用它的Apple演示应用程序,我想知道我是否错过了一个很棒的工具,而不是使用NSThread
。
这里理想的解决方案是描述NSOperation
的用例场景以及如何使用它来解决您的问题。
我在iPhone应用程序中使用它的方法是在我的应用程序委托中基本创建一个NSOperationQueue成员,并通过属性使其可用。 然后每当我需要在后台运行某些东西时,例如下载一些XML,我只需创建一个NSInvocationOperation并将其发送到queque。
NSInvocationOperation *operationToPerform = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(updateXML) object:nil];
[[(MyAppDelegate *)[[UIApplication sharedApplication] delegate] sharedOperationQueue] addOperation:operationToPerform];
[op release];
总之一句话: NSOperationQueue
NSOperationQueue
是线程安全的(您可以从不同的线程向其添加操作而无需锁定),并使您能够将NSOp对象链接在一起。
我的Flickr iPhone应用程序Reflections,广泛使用NSOperation
和NSOperationQueue
来管理下载图像和XML
。
警告:确保您在阅读“并发”时阅读,重新阅读并理解文档的含义。
您还应该查看此URL: http : //developer.apple.com/cocoa/managingconcurrency.html
以上所有答案都很棒,但请确保您阅读上面的文章并在代码中自由使用此行:
if ( self.isCancelled ) return;
在Coca提供的样本中没有使用该行是我的女朋友,直到我从现场获得崩溃登录才知道这是一个问题/概念。
这是一个非常简单的实现,但需要时间阅读教程以完全理解所有内容:
NSOperationQueue *queue = [NSOperationQueue new];
NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self
selector:@selector(methodToCall)
object:objectToPassToMethod];
[queue addOperation:operation];
我用它进行异步处理。 这是从Web服务获取数据或协调需要大量时间运行的操作的最佳方法。 因为它们是线程安全的,异步的(不占用主线程)并且它们支持依赖性,所以它们对于您的工具集来说是一个非常好的工具。
依赖关系允许您进行多个单独的操作,并确保以特定顺序执行并成功或错误输出。 当您需要同步一堆数据但在同步子对象之前需要同步父对象时,这非常好。
您可以尝试使用Swift的示例
let operation : NSOperation = NSOperation()
operation.completionBlock = {
println("Completed")
}
let operationQueue = NSOperationQueue.mainQueue()
operationQueue.addOperation(operation)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.