首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >全局NSOperationQueue

全局NSOperationQueue
EN

Stack Overflow用户
提问于 2012-05-15 23:26:37
回答 2查看 2.8K关注 0票数 2

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-08 00:29:56

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

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

它将有一个名为myGlobalQueueivar

代码语言:javascript
复制
@property (nonatomic) NSOperationQueue* myGlobalQueue;

MyGlobalQueueManager.m文件中,创建一个相当标准的init方法来设置操作队列:

代码语言:javascript
复制
- (id)init
{
    self = [super init];
    if (self)
    {
        myGlobalOperationQueue = [[NSOperationQueue alloc] init];
    }
    return self;
}

现在,将自身作为单例提供的方法。同样,这是非常标准的东西:

代码语言:javascript
复制
 + (MyGlobalQueueManager *)sharedInstance
{
    static MyGlobalQueueManager *sharedInstance = nil;
    static dispatch_once_t isDispatched;

    dispatch_once(&isDispatched, ^
                  {
                      sharedInstance = [[MyGlobalQueueManager alloc] init];
                  });

    return sharedInstance;
}

让我们从您想要使用队列的任何位置访问它:

代码语言:javascript
复制
MyGlobalQueueManager* myGlobalQueueManager = [MyGlobalQueueManager sharedInstance];
NSOperationQueue *myGlobalQueue = myGlobalQueueManager.myGlobalOperationQueue;

然后,您可以随心所欲地向该队列添加操作。

如何知道是否有任何东西在排队?

代码语言:javascript
复制
NSUInteger count = [myGlobalQueue operationCount];

如何中止?按如下所示取消所有操作:

代码语言:javascript
复制
[myGlobalQueue cancelAllOperations];

当然,取消操作取决于操作。如果您正在编写自定义NSOperation类,则需要自己处理。

我发现NSOperationNSOperationQueue非常容易使用,而且非常简单。

一个值得阅读的好文档是并发编程指南。具体地说,来看看Operation Queues

票数 7
EN

Stack Overflow用户

发布于 2013-03-11 15:06:03

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

代码语言:javascript
复制
extern NSOperationQueue * SharedQueue();

并在你的编译“单元”中定义它--但是在 @implementation之外定义它。

代码语言:javascript
复制
NSOperationQueue *SharedOperationQueue()
{
  static NSOperationQueue * _SharedQueue = nil;
  return _SharedQueue ?: ^{ _SharedQueue = NSOperationQueue.new;
                            _SharedQueue.maxConcurrentOperationCount = NSOperationQueueDefaultMaxConcurrentOperationCount;
                     return _SharedQueue;
  }();
}

作为一点小奖励..。使用“别名”#define它..你可以用REALLy来滥用它!

代码语言:javascript
复制
#define MY_SOQ SharedOperationQueue()

[MY_SOQ addOperationWithBlock:^{ /* GO CRAZY */ }];
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10603963

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档