我一直在寻找一些具体场景,NSOperation
说明 iPhone 何时是在应用程序中使用的理想工具。据我了解,这是围绕编写您自己的threaded
代码的包装。我还没有看到任何使用它的 Apple 演示应用程序,我想知道我是否错过了一个很棒的工具而不是使用NSThread
.
这里的理想解决方案是描述一个用例场景NSOperation
以及如何使用它来解决您的问题。
我一直在寻找一些具体场景,NSOperation
说明 iPhone 何时是在应用程序中使用的理想工具。据我了解,这是围绕编写您自己的threaded
代码的包装。我还没有看到任何使用它的 Apple 演示应用程序,我想知道我是否错过了一个很棒的工具而不是使用NSThread
.
这里的理想解决方案是描述一个用例场景NSOperation
以及如何使用它来解决您的问题。
我在 iPhone 应用程序中使用它的方式基本上是在我的应用程序委托中创建一个 NSOperationQueue 成员,并通过属性使其可用。然后每次我需要在后台运行某些东西时,例如下载一些 XML,我将创建一个 NSInvocationOperation 并将其发送到队列。
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 is my Girlfriend 提供的样本中没有使用该行,直到我从现场获得崩溃日志后,我才意识到这是一个问题/概念。
这只是一个非常简单的实现,但需要花时间阅读教程以完全理解所有内容:
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)