Objective c 全局操作队列

Objective c 全局操作队列,objective-c,xcode,nsoperation,nsoperationqueue,Objective C,Xcode,Nsoperation,Nsoperationqueue,我正在尝试创建NSOperationQueue并向其中添加NSOperation。稍后我不想检查队列是否正在运行,可能会中止它。所有这些都应该从不同的函数中调用。最好的方法是什么?我很乐意提供一个代码示例。谢谢 我将创建一个由单例管理的操作队列 首先,创建singleton类。它将提供对NSOperationQueue的访问。让我们调用singleton MyGlobalQueueManager 它将有一个名为myGlobalQueue的ivar: 在MyGlobalQueueManager的.

我正在尝试创建NSOperationQueue并向其中添加NSOperation。稍后我不想检查队列是否正在运行,可能会中止它。所有这些都应该从不同的函数中调用。最好的方法是什么?我很乐意提供一个代码示例。谢谢

我将创建一个由单例管理的操作队列

首先,创建singleton类。它将提供对NSOperationQueue的访问。让我们调用singleton MyGlobalQueueManager

它将有一个名为myGlobalQueue的ivar:

在MyGlobalQueueManager的.m文件中,创建一个相当标准的init方法来设置操作队列:

- (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 */ }];