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