我正在尝试创建一个NSOperationQueue并向其中添加一个NSOperation。稍后,我不想检查队列是否正在运行,并可能中止它。所有这些都应该从不同的函数中调用。做这件事最好的方法是什么?如果能有一个代码示例,我会很高兴。谢谢!
发布于 2012-09-08 00:29:56
我会创建一个由单例管理的操作队列。
首先,创建你的单例类。它将提供对NSOperationQueue的访问。让我们将单例称为MyGlobalQueueManager。
它将有一个名为myGlobalQueue的ivar
@property (nonatomic) NSOperationQueue* myGlobalQueue;在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非常容易使用,而且非常简单。
一个值得阅读的好文档是并发编程指南。具体地说,来看看Operation Queues
发布于 2013-03-11 15:06:03
一种更简单的方法是创建一个“全局可见”的函数。也就是说,在一个公共头中声明它:
extern NSOperationQueue * SharedQueue();并在你的编译“单元”中定义它--但是在 @implementation之外定义它。
NSOperationQueue *SharedOperationQueue()
{
static NSOperationQueue * _SharedQueue = nil;
return _SharedQueue ?: ^{ _SharedQueue = NSOperationQueue.new;
_SharedQueue.maxConcurrentOperationCount = NSOperationQueueDefaultMaxConcurrentOperationCount;
return _SharedQueue;
}();
}作为一点小奖励..。使用“别名”#define它..你可以用REALLy来滥用它!
#define MY_SOQ SharedOperationQueue()
[MY_SOQ addOperationWithBlock:^{ /* GO CRAZY */ }];https://stackoverflow.com/questions/10603963
复制相似问题