共享NSOperationQueue跨越视图控制器?(Sharing NSOperationQueu

2019-08-03 04:50发布

我使用的是NSOperationQueue管理HTTP连接(使用ASI-的HTTPRequest)。 由于我有多个意见,并需要有这些不同的观点请求的HTTP连接,我应该尝试在应用程序委托打造全球NSOperationQueue,或者我应该有一个在每个视图? 我不熟悉NSOperationQueue。

我想知道),最好的做法是什么和b)如果没有最好的做法,什么折衷方案如果有的话。

我也尝试投入运行队列中的类(作为属性),我处理服务器连接,但从来没有发射任务。 想不出数字出来,但[队列操作] = 0。如果有人知道解决这个问题,我想这将是把它最好的地方。

Answer 1:

我已经通过增加对NSOperationQueue一个类的方法,我认为苹果已经错过了解决这一点; 一个共享操作队列。 我添加此作为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


Answer 2:

我给这家个人的偏好是有一个管理所有的HTTP请求单。 然后,每个视图会要求单身,使HTTP调用,传递自己作为一个代表该呼叫,则单手即代表并取消到的NSOperation然后的NSOperation回调一旦调用完成。



Answer 3:

如果你已经有了一个指向处理在每个视图/视图控制器连接的一类,没有任何理由,你还需要有一个指针操作队列。

我想你想要做的是一样的东西:A)视图(控制器)手中URL(+数据)服务器处理对象,B)服务器处理对象的创建操作,并把它放在它队列中,只有它有一个指针。

很难找出原因,如果你不提供更多的细节,没有工作。

我强烈建议考虑看看ASIHTTPRequest提供了一个NetworkQueue类来处理这样的任务。 它有几个方便的委托领域,让您注册跟踪进度,知道什么时候下载或上传完成等。



文章来源: Sharing NSOperationQueue across View Controllers?