Objective c 全局操作队列
我正在尝试创建NSOperationQueue并向其中添加NSOperation。稍后我不想检查队列是否正在运行,可能会中止它。所有这些都应该从不同的函数中调用。最好的方法是什么?我很乐意提供一个代码示例。谢谢 我将创建一个由单例管理的操作队列 首先,创建singleton类。它将提供对NSOperationQueue的访问。让我们调用singleton MyGlobalQueueManager 它将有一个名为myGlobalQueue的ivar: 在MyGlobalQueueManager的.m文件中,创建一个相当标准的init方法来设置操作队列:Objective c 全局操作队列,objective-c,xcode,nsoperation,nsoperationqueue,Objective C,Xcode,Nsoperation,Nsoperationqueue,我正在尝试创建NSOperationQueue并向其中添加NSOperation。稍后我不想检查队列是否正在运行,可能会中止它。所有这些都应该从不同的函数中调用。最好的方法是什么?我很乐意提供一个代码示例。谢谢 我将创建一个由单例管理的操作队列 首先,创建singleton类。它将提供对NSOperationQueue的访问。让我们调用singleton MyGlobalQueueManager 它将有一个名为myGlobalQueue的ivar: 在MyGlobalQueueManager的.
- (id)init
{
self = [super init];
if (self)
{
myGlobalOperationQueue = [[NSOperationQueue alloc] init];
}
return self;
}
现在,将自己作为单例提供的方法。同样,这是相当标准的东西:
+ (MyGlobalQueueManager *)sharedInstance
{
static MyGlobalQueueManager *sharedInstance = nil;
static dispatch_once_t isDispatched;
dispatch_once(&isDispatched, ^
{
sharedInstance = [[MyGlobalQueueManager alloc] init];
});
return sharedInstance;
}
让我们从您想要使用该队列的任何位置访问该队列:
MyGlobalQueueManager* myGlobalQueueManager = [MyGlobalQueueManager sharedInstance];
NSOperationQueue *myGlobalQueue = myGlobalQueueManager.myGlobalOperationQueue;
然后,您可以根据需要向该队列添加操作
如何知道是否有东西排队
NSUInteger count = [myGlobalQueue operationCount];
如何中止?按如下方式取消所有操作:
[myGlobalQueue cancelAllOperations];
取消当然取决于操作。如果您正在编写自定义NSOperation类,则需要自己处理
我发现NSOperation和NSOperationQueue非常易于使用,而且非常简单
一个很好的文档是并发编程指南。具体地说,看一看一个更简单的方法是创建一个全局可见的函数。AKA,在公共标题中声明它:
extern NSOperationQueue * SharedQueue();
并在编译单元内定义它,但在任何@实现之外
作为一点小奖励。。用别名定义它。。你真的可以滥用它
#define MY_SOQ SharedOperationQueue()
[MY_SOQ addOperationWithBlock:^{ /* GO CRAZY */ }];
它并没有真正回答你的问题,但是中央调度中心提供了开箱即用的全球队列。这可能就是我想要的答案。非常感谢你!我设法创建并添加了一个队列,但我不知道如何取消队列中的任务。这是GCD的警告之一。Hey@Max MacLeod如果我有两个uicontroller,并且在first in ViewWillEnglishe调用函数cancelAllOperations on Singleton的队列我在第二个viewcontroller的ViewDiLoad中启动,其中第一个由导航控制器推送第二个,会对N操作产生影响吗?在这种情况下,我会在每个视图控制器中都有一个队列。否则它会变得更复杂。看看苹果公司提供的MVCNetworking示例项目。它演示了一个操作三个或四个不同队列的网络管理器单例。
NSOperationQueue *SharedOperationQueue()
{
static NSOperationQueue * _SharedQueue = nil;
return _SharedQueue ?: ^{ _SharedQueue = NSOperationQueue.new;
_SharedQueue.maxConcurrentOperationCount = NSOperationQueueDefaultMaxConcurrentOperationCount;
return _SharedQueue;
}();
}
#define MY_SOQ SharedOperationQueue()
[MY_SOQ addOperationWithBlock:^{ /* GO CRAZY */ }];