我正在使用NSOperationQueue来管理HTTP连接(使用ASI-HTTPRequest)。由于我有多个视图并且需要让这些不同的视图请求HTTP连接,我应该尝试在app委托中创建全局NSOperationQueue,还是应该在每个视图中都有一个?我不熟悉NSOperationQueue。
我想知道a)最佳做法是什么,b)如果没有最佳实践,那么权衡是什么。
我确实尝试将操作队列放在我处理服务器连接的类中(作为属性),但任务从未触发过。无法弄清楚,但[队列操作] = 0.如果有人知道解决方案,我认为这将是最好的地方。
答案 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类来处理这类任务。它有几个方便的委托字段,可让您注册以跟踪进度,知道下载或上传完成时间等。