2009-04-18 42 views
9

我有一個NSInvocationOperation,可以在後臺下載和解析一系列NSXMLDocuments以響應我的UI。如何停止NSInvocationOperation?

我試圖停止調用操作是調用我的NSOperationQueue的cancellAllOperations。但似乎這不會阻止調用的執行。

關於如何解決此問題的任何想法?

回答

3

這取決於你的NSOperation對象實現真正停止它在做什麼,清理和退出時得到通知,它的被取消。要取消隊列上所有操作的消息傳遞將導致隊列停止將新操作出列並運行,並將取消消息發送到當前正在運行的任何操作。

在您操作的主要方法,你應該檢查isCancelled和處理這種狀態時,你實際上是取消了。

欲瞭解更多信息,請參閱線程編程指南中的Creating and Managing Operation Objects。上述

+0

但看到其他答案,它聽起來像你不能這樣做(至少在檢查`isCancelled`的標準方式)使用'NSInvocationOperation`時。 – jrdioko 2011-05-31 18:14:35

5

的職位是偉大的,但更直接地回答原來的問題:看來,你不能阻止NSInvocationOperation對象,因爲它不支持取消。你將不得不繼承它的子類。

11

UPDATE:儀器顯示的泄漏-A-很多我這樣做的時候。 謹慎行事!我在這裏保持這種情況,以防我實際上處於某種狀況,而其他人可以弄清楚如何克服漏洞障礙。

這裏有一個扭曲的想法,這我再努力,因爲我輸入:

設置操作爲對象NSInvocationOperationinitWithTarget:選擇:對象:方法。假設你已經有一個NSOperationQueue(我們就叫它隊列):

NSInvocationOperation *operation = [NSInvocationOperation alloc]; 
operation = [operation initWithTarget:self selector:@selector(myOperation:) object:operation]; 
[queue addOperation:operation]; 
[operation release]; 

請注意,我們必須掰開ALLOC到它自己的呼叫。否則我們不能設置對象操作

然後,在您的操作方法中,將對象拋回並根據需要對進行檢查iswasCallarlled。例如:

- (void)myOperation:(id)object { 
    NSInvocationOperation *operation = (NSInvocationOperation *)object; 
    if ([operation isCancelled]) return; 
    ... 
    } 

確保你選擇用冒號後面的initWithTarget結束:...通話,因爲你在一個對象路過了。

到目前爲止,這麼好。現在,如果我可以強制cancelAllOperations,我會知道這是否真的有效。 :)

+0

由於泄漏,不會嘗試。但想法很棒! – 2012-06-13 17:39:02

8

您需要檢查NSInvocationOperation isCancelled是否。 要做到這一點在NSInvocationOperation,您可以使用Key值觀察:

運行操作時添加您的對象作爲NSInvocationOperation isCancelled觀察員:

NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:<targetObj> selector:@selector(<targetMethod>) object:nil]; 
[operation addObserver:<targetObj> forKeyPath:@"isCancelled" options:NSKeyValueObservingOptionNew context:nil]; 
[operQueue addOperation:operation]; 
[operation release]; 

然後在targetObj實施

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context; 

觀看因爲isCancelled被NSOperationQueue的cancellAllOperations所改變。 您可以在此處設置私人標誌,並且targetMethod可以檢查它並在需要時取消。