NSOperation在iPhone上
我一直在寻找一些具体的情况,当在NSOperation
上的NSOperation
是一个理想的工具,在应用程序中使用。 据我的理解,这是一个围绕你自己的threaded
代码的封装。 我还没有看到任何苹果演示应用程序使用它,我想知道如果我错过了一个伟大的工具,而不是使用NSThread
。
这里的理想解决scheme是描述NSOperation
的用例场景,以及如何使用它来解决您的问题。
cocoa是我的女朋友有一个关于使用NSOperation
和NSOperationQueue
的好教程 。 本教程利用NSOperation
在不同的线程中同时下载几个网页。
另外,请参阅Mac Research的这篇文章 。
我在我的iPhone应用程序中使用它的方式是基本上在我的应用程序委托中创build一个NSOperationQueue成员,并通过属性使其可用。 然后每次我需要在后台运行一些东西时,例如下载一些XML,我只需创build一个NSInvocationOperation并将其发送到队列。
NSInvocationOperation *operationToPerform = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(updateXML) object:nil]; [[(MyAppDelegate *)[[UIApplication sharedApplication] delegate] sharedOperationQueue] addOperation:operationToPerform]; [op release];
总之: NSOperationQueue
NSOperationQueue
是线程安全的(您可以从不同的线程添加操作而不需要locking),并使您可以将NSOp对象链接在一起。
我的Flickr iPhone应用程序Reflections使用NSOperation
和NSOperationQueue
来pipe理下载图像和XML
。
警告:确保您阅读,重读和理解文档在讨论“并发性”时的含义。
你也应该看看这个URL: http : //developer.apple.com/cocoa/managingconcurrency.html
所有这些上面的答案都很好,但是请确保你阅读了上面的文章,并在代码中自由使用这一行:
if ( self.isCancelled ) return;
可口可乐提供的样品是我的女朋友,没有使用这条线,直到我从现场崩溃login,我意识到这是一个问题/概念。
这只是一个非常简单的实现,但需要花时间阅读教程,以充分理解一切:
NSOperationQueue *queue = [NSOperationQueue new]; NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(methodToCall) object:objectToPassToMethod]; [queue addOperation:operation];
我用它来进行asynchronous处理。 从Web服务获取数据或协调需要大量时间运行的操作是最好的方法。 因为它们是线程安全的,asynchronous的(不捆绑主线程)并且它们支持依赖关系,所以它们对于你的工具集来说是一个非常棒的工具。
依赖性允许你做几个单独的操作,并确保执行和成功或错误在一定的顺序。 当你需要同步一堆数据,但是在同步子对象之前需要父对象进行同步时,这非常棒。
一个可以尝试使用Swift的示例
let operation : NSOperation = NSOperation() operation.completionBlock = { println("Completed") } let operationQueue = NSOperationQueue.mainQueue() operationQueue.addOperation(operation)