2

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

4

2 回答 2

7

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

首先,创建你的单例类。它将提供对NSOperationQueue. 我们称之为单例MyGlobalQueueManager

它将有一个ivar被调用的myGlobalQueue

@property (nonatomic) NSOperationQueue* myGlobalQueue;

在 的.m文件中MyGlobalQueueManager,创建一个相当标准的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相当容易使用并且非常简单。

并发编程指南是一个很好的阅读文档。具体来说,看看操作队列

于 2012-09-07T16:29:56.213 回答
2

一个更简单的方法是创建一个“全局可见”的函数。又名,在公共标头中声明它:

extern NSOperationQueue * SharedQueue();

并在您的编译“单元”中定义它 - 但任何@implementation.

NSOperationQueue *SharedOperationQueue()
{
  static NSOperationQueue * _SharedQueue = nil;
  return _SharedQueue ?: ^{ _SharedQueue = NSOperationQueue.new;
                            _SharedQueue.maxConcurrentOperationCount = NSOperationQueueDefaultMaxConcurrentOperationCount;
                     return _SharedQueue;
  }();
}

作为一个小奖励.. #define它带有“别名”..你真的可以滥用它!

#define MY_SOQ SharedOperationQueue()

[MY_SOQ addOperationWithBlock:^{ /* GO CRAZY */ }];
于 2013-03-11T07:06:02.923 回答