跨视图控制器共享NSOperationQueue?

时间:2009-08-31 10:45:55

标签: iphone objective-c http networking

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

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

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

3 个答案:

答案 0 :(得分:14)

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

答案 1 :(得分:3)

我个人对此的偏好是拥有一个管理所有http请求的单例。然后每个视图都会要求单身人士进行http呼叫,将自己作为该呼叫的委托者传递,然后将单人手牌委托给NSOperation,然后NSOperation在呼叫完成后回叫。

答案 2 :(得分:0)

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

我想你想做的事情是这样的:a)查看(控制器)手url(+数据)到服务器处理对象,b)服务器处理对象创建操作并将其放入队列中,只有它有指向。

的指针

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

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