Iphone 是否跨视图控制器共享NSOperationQueue?

Iphone 是否跨视图控制器共享NSOperationQueue?,iphone,objective-c,http,networking,Iphone,Objective C,Http,Networking,我正在使用NSOperationQueue来管理HTTP连接(使用ASI HTTPRequest)。由于我有多个视图,并且需要这些不同的视图请求HTTP连接,我应该尝试在app delegate中创建一个全局NSOperationQueue,还是应该在每个视图中创建一个?我不熟悉NSOperationQueue 我想知道a)最佳实践是什么,b)如果没有最佳实践,权衡是什么(如果有的话) 我确实尝试将操作队列放在我处理服务器连接的类中(作为属性),但任务从未启动。无法计算,但[队列操作]=0。如果

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

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


我确实尝试将操作队列放在我处理服务器连接的类中(作为属性),但任务从未启动。无法计算,但[队列操作]=0。如果有人知道这个问题的解决方案,我认为这是最好的地方。

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

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

如果你不提供更多的细节,很难理解为什么这样做不起作用


我强烈建议提供NetworkQueue类来处理此类任务。它有几个方便的委托字段,可以让您注册以跟踪进度,知道下载或上载何时完成等。

我通过在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

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

我做同样的事情,除了1)我不使用单例,我使用挂起应用程序委托的dataController,2)我使用通知而不是委托。对于多个视图控制器和请求/操作,委派逻辑可能会变得非常复杂。如何再次解除分配此队列?