全球NSOperationQueue

Nik*_*iko 2 xcode objective-c nsoperation nsoperationqueue

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

Max*_*eod 7

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

首先,创建你的单例类.它将提供访问NSOperationQueue.我们打电话给单身人士MyGlobalQueueManager.

它会有一个ivarmyGlobalQueue:

@property (nonatomic) NSOperationQueue* myGlobalQueue;
Run Code Online (Sandbox Code Playgroud)

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

- (id)init
{
    self = [super init];
    if (self)
    {
        myGlobalOperationQueue = [[NSOperationQueue alloc] init];
    }
    return self;
}
Run Code Online (Sandbox Code Playgroud)

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

 + (MyGlobalQueueManager *)sharedInstance
{
    static MyGlobalQueueManager *sharedInstance = nil;
    static dispatch_once_t isDispatched;

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

    return sharedInstance;
}
Run Code Online (Sandbox Code Playgroud)

让我们从您想要使用它的任何地方访问该队列:

MyGlobalQueueManager* myGlobalQueueManager = [MyGlobalQueueManager sharedInstance];
NSOperationQueue *myGlobalQueue = myGlobalQueueManager.myGlobalOperationQueue;
Run Code Online (Sandbox Code Playgroud)

然后,您可以根据自己的喜好向该队列添加操作.

如何知道是否有任何排队?

NSUInteger count = [myGlobalQueue operationCount];
Run Code Online (Sandbox Code Playgroud)

如何中止?取消所有内容如下:

[myGlobalQueue cancelAllOperations];
Run Code Online (Sandbox Code Playgroud)

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

我发现NSOperation并且NSOperationQueue相当容易使用且非常简单.

阅读所有这些的一个很棒的文档是并发编程指南.具体来说,看一下Operation Queues