我正在尝试创建一个NSOperationQueue并为其添加一个NSOperation。后来我不想检查队列是否正在运行并且可能中止它。所有这些都应该从不同的函数中调用。这样做的最佳方法是什么?我会很高兴一个代码示例。谢谢!
答案 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];
类,则需要自己处理。
我发现NSOperation
和NSOperation
相当容易使用且非常简单。
要阅读所有这些内容的好文档是“并发编程指南”。具体来说,请查看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 */ }];