【问题标题】:Sharing NSOperationQueue across View Controllers?跨视图控制器共享 NSOperationQueue?
【发布时间】:2009-08-31 10:45:55
【问题描述】:

我正在使用 NSOperationQueue 来管理 HTTP 连接(使用 ASI-HTTPRequest)。由于我有多个视图并且需要这些不同的视图来请求 HTTP 连接,我应该尝试在应用程序委托中创建一个全局 NSOperationQueue,还是应该在每个视图中都有一个?我对 NSOperationQueue 不熟悉。

我想知道 a) 最佳实践是什么,b) 如果没有最佳实践,如果有的话,权衡是什么。

我确实尝试将操作队列放在我处理服务器连接但任务从未触发的类(作为属性)中。无法弄清楚,但 [队列操作] = 0。如果有人知道解决方案,我认为这将是放置它的最佳位置。

【问题讨论】:

    标签: iphone objective-c http networking


    【解决方案1】:

    我通过在 NSOperationQueue 上添加一个我认为 Apple 忽略的类方法解决了这个问题;共享操作队列。我将其添加为 NSOperationQueue 上的一个类别,如下所示:

    // NSOperationQueue+SharedQueue.h
    @interface NSOperationQueue (SharedQueue)
    +(NSOperationQueue*)sharedOperationQueue;
    @end
    
    // NSOperationQueue+SharedQueue.m
    @implementation NSOperationQueue (SharedQueue)
    +(NSOperationQueue*)sharedOperationQueue;
    {
      static NSOperationQueue* sharedQueue = nil;
      if (sharedQueue == nil) {
        sharedQueue = [[NSOperationQueue alloc] init];
      }
      return sharedQueue;
    }
    @end
    

    这样我不需要管理一大堆队列,除非我真的需要。我可以从所有视图控制器轻松访问共享队列。

    我什至为 NSObject 添加了一个类别,以便更轻松地在此共享队列上添加新操作:

    // NSObject+SharedQueue.h
    @interface NSObject (SharedQueue)
    -(void)performSelectorOnBackgroundQueue:(SEL)aSelector withObject:(id)anObject;
    @end
    
    // NSObject+SharedQueue.m
    @implementation NSObject (SharedQueue)
    -(void)performSelectorOnBackgroundQueue:(SEL)aSelector withObject:(id)anObject;
    {
      NSOperation* operation = [[NSInvocationOperation alloc] initWithTarget:self
                                                                    selector:aSelector
                                                                      object:anObject];
      [[NSOperationQueue sharedOperationQueue] addOperation:operation];
      [operation release];
    }
    @end
    

    【讨论】:

    • 这个队列如何再次被释放?
    【解决方案2】:

    我个人对此的偏好是拥有一个管理所有 http 请求的单例。然后,每个视图都会要求单例进行 http 调用,将自己作为该调用的委托传递,然后单例将委托和调用交给 NSOperation,然后一旦调用完成,NSOperation 就会回调。

    【讨论】:

    • 我做同样的事情,除了 1) 我不使用单例,我使用挂起应用程序委托的 dataController 和 2) 我使用通知而不是委托。使用多个视图控制器和请求/操作,委托逻辑可能会变得非常复杂。
    【解决方案3】:

    如果您已经有一个指向处理每个视图/视图控制器中的连接的类的指针,那么您没有理由还需要一个指向操作队列的指针。

    我想你想做的是:a)视图(控制器)将url(+数据)交给服务器处理对象,b)服务器处理对象创建操作并将其放入队列中,只有它有一个指向的指针。

    如果你不提供更多细节,很难弄清楚为什么这不起作用。

    我强烈推荐taking a look at ASIHTTPRequest,它提供了一个 NetworkQueue 类来处理这种任务。它有几个方便的委托字段,可让您注册以跟踪进度、知道下载或上传何时完成等。

    【讨论】:

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