2012-05-15 45 views
2

我想創建一個NSOperationQueue並添加一個NSOperation。後來我不想檢查隊列是否正在運行,可能會中止它。所有這些都應該從不同的功能中調用。什麼是最好的方法來做到這一點?我會爲代碼示例感到高興。謝謝!全球NSOperationQueue

+1

它沒有真正回答你的問題,但Grand Central Dispatch提供了開箱即用的全局隊列。 – gcamp

+0

這可能是我正在尋找的答案。非常感謝你! – Linus

+0

我設法創建並添加了一個隊列,但我無法弄清楚如何取消隊列中的任務。 – Linus

回答

7

我會創建一個由單例管理的操作隊列。

首先,創建你的單例類。它將提供訪問NSOperationQueue。我們打電話給單身人士MyGlobalQueueManager

這將有ivarmyGlobalQueue

@property (nonatomic) NSOperationQueue* myGlobalQueue; 

.m文件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,則需要自己處理。

我覺得NSOperationNSOperationQueue是相當容易使用和相當簡單。

一個很棒的文檔可以讀取所有這些是併發編程指南。具體來說,看看Operation Queues

+0

嗨@Max MacLeod如果我有兩個uicontrollers,並在第一個viewWillDisappear調用函數cancelAllOperations Singleton的隊列它會影響NSOpearation,我開始在第二視圖控制器的viewdidload首先是由導航控制器推第二? –

+1

在這種情況下,我會在每個視圖控制器中有一個隊列。否則它變得更加複雜。看看Apple提供的MVCNetworking示例項目。它演示了一個運行三到四個不同隊列的網絡管理員單身人士。 –

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 */ }];