【问题标题】:NSOperation on the iPhoneiPhone 上的 NSOperation
【发布时间】:2010-10-24 05:35:20
【问题描述】:

我一直在寻找一些具体的场景,当 iPhone 上的 NSOperation 是在应用程序中使用的理想工具时。据我了解,这是编写您自己的threaded 代码的包装。我还没有看到任何使用它的 Apple 演示应用程序,我想知道我是否错过了一个很棒的工具,而不是使用 NSThread

这里的理想解决方案是描述NSOperation 的用例场景以及您将如何使用它来解决您的问题。

【问题讨论】:

  • 您可能需要考虑选择这些优秀答案之一作为解决方案。 (:

标签: iphone objective-c cocoa-touch multithreading nsoperation


【解决方案1】:

一句话:NSOperationQueue

NSOperationQueue 是线程安全的(您可以从不同的线程向它添加操作,而无需锁),并且使您能够将 NSOp 对象链接在一起。

我的 Flickr iPhone 应用 Reflections 广泛使用 NSOperationNSOperationQueue 来管理下载图像和 XML

警告:确保您阅读、重新阅读并理解文档在谈论“并发”时的含义。

【讨论】:

【解决方案2】:

我在 iPhone 应用程序中使用它的方式基本上是在我的应用程序委托中创建一个 NSOperationQueue 成员,并通过属性使其可用。然后每次我需要在后台运行一些东西,例如下载一些 XML 我将创建一个 NSInvocationOperation 并将其发送到队列。

NSInvocationOperation *operationToPerform = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(updateXML) object:nil];
[[(MyAppDelegate *)[[UIApplication sharedApplication] delegate] sharedOperationQueue] addOperation:operationToPerform];
[op release];

【讨论】:

    【解决方案3】:

    您可以尝试使用 Swift 的示例

    let operation : NSOperation = NSOperation()
    operation.completionBlock = {
    println("Completed")
    }
    
    let operationQueue = NSOperationQueue.mainQueue()
    operationQueue.addOperation(operation)
    

    【讨论】:

      【解决方案4】:

      我将它用于异步处理。这是从 Web 服务获取数据或协调需要大量时间运行的操作的最佳方式。因为它们是线程安全的、异步的(不占用主线程)并且它们支持依赖关系,所以它们对于您的工具集来说是一个非常棒的工具。

      依赖项允许您进行多个单独的操作,并确保按特定顺序执行并成功或出错。当您需要同步一堆数据但需要在同步子对象之前同步父对象时,这真的很棒。

      【讨论】:

        【解决方案5】:

        这只是一个非常简单的实现,但需要花时间阅读教程才能完全理解所有内容:

        NSOperationQueue *queue = [NSOperationQueue new];
        
        NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self
            selector:@selector(methodToCall)
            object:objectToPassToMethod];
        
        [queue addOperation:operation];
        

        【讨论】:

          【解决方案6】:

          您还应该查看以下网址: http://developer.apple.com/cocoa/managingconcurrency.html

          以上所有这些答案都很棒,但请确保您阅读了上面的文章并在您的代码中充分利用这一行:

          if ( self.isCancelled ) return;
          

          在 Coca is my Girlfriend 提供的样本中没有使用该行,直到我从现场获得崩溃日志后,我才意识到这是一个问题/概念。

          【讨论】:

          • 你能解释一下这条线到底是做什么的吗?我应该把它放在代码的哪里?
          • 它检查操作是否已被取消,如果是则提前退出。
          【解决方案7】:

          Cocoa Is My Girlfriend 有一个 good tutorial 使用 NSOperationNSOperationQueue。本教程使用NSOperation在不同线程中同时下载多个网页。

          另外,请参阅来自 Mac Research 的 this article

          【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-01-18
          • 1970-01-01
          • 2011-04-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多