【问题标题】:Global NSOperationQueue全局 NSOperationQueue
【发布时间】:2012-05-15 15:26:37
【问题描述】:

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

【问题讨论】:

  • 它并不能真正回答您的问题,但 Grand Central Dispatch 提供开箱即用的全球队列。
  • 这可能是我正在寻找的答案。非常感谢!
  • 我设法创建并添加了一个队列,但我不知道如何取消队列中的任务。
  • 这是 GCD 的警告之一。 stackoverflow.com/questions/5449469/…

标签: objective-c xcode nsoperation nsoperationqueue


【解决方案1】:

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

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

它将有一个名为myGlobalQueueivar

@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 类,则需要自己处理。

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

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

【讨论】:

  • 嘿 @Max MacLeod 如果我有两个 uicontrollers 并且首先在 viewWillDisappear 调用 Singleton 队列上的函数 cancelAllOperations 是否会对我在第二个 viewcontroller 的 viewdidload 中开始的 NSOpearation 产生影响,其中第一个是由导航控制器推动第二个?
  • 在这种情况下,我将在每个视图控制器中都有一个队列。否则会变得更复杂。查看 Apple 提供的 MVCNetworking 示例项目。它演示了一个运行三个或四个不同队列的网络管理器单例。
【解决方案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 */ }];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-05
    • 1970-01-01
    • 2011-12-23
    • 2015-07-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多