全球NSOperationQueue

时间:2012-05-15 15:26:37

标签: objective-c xcode nsoperation nsoperationqueue

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

2 个答案:

答案 0 :(得分:7)

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

首先,创建你的单例类。它将提供对NSOperationQueue的访问权限。我们打电话给单身MyGlobalQueueManager

它将ivar名为myGlobalQueue

@property (nonatomic) NSOperationQueue* myGlobalQueue;

.m的{​​{1}}文件中,创建一个相当标准的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]; 类,则需要自己处理。

我发现NSOperationNSOperation相当容易使用且非常简单。

要阅读所有这些内容的好文档是“并发编程指南”。具体来说,请查看Operation Queues

答案 1 :(得分:1)

更简单的方法是制作“全局可见”功能。 AKA,在公共标题中声明:

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