2010-04-09 130 views
1

我正在創建一個MyOperation對象(從NSOperation繼承)並添加到NSOperationQueue。然後我在MyOperation上做KVO。 我使用這種方法NSoperation和關鍵值觀察

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

如果完成了擺脫MyOperation的值。在這種方法中,我使用其他類的便捷方法來獲取其他數據。

也許在這裏同步問題的observeValue ...方法?

回答

12

我沒有足夠的聲望評論或投票,但我會降票dannywartnaby的答案。 NSOperation內部使用KVO;必須實施已完成並且作爲處理的一部分執行,例如100%KVO並且是與客戶/隊列的操作所需合同的一部分。所以建議這些應該避免是不準確的; NSOperation使用KVO本身,所以採用dannywartnaby的前提將表明NSOperation的實現本身是有缺陷的,這絕對不是這種情況。

不可否認,開發人員必須小心地正確使用KVO,儘管我會爭辯說NSOperation的子類化是一個非常重要的任務,可能會留給更有經驗的Objective-C程序員。有人可能會說,對於某項手術所進行的工作來說,通知過於粗糙,但我認爲在爲實踐提供建議以確保錯誤的信息不會作爲最佳實踐通過時,我們必須小心謹慎。丹尼,你會不會詳細說明爲什麼在使用NSOperation或線程時不建議使用KVO? NSOperation實施的許多示例使用KVO ...

+0

謝謝你的回答! – 2011-03-27 17:21:54

+0

NSOpertation中使用KVO的impl是一個有爭議的問題;我不是說KVO不好,我說通知是一個更好的選擇。其他使用KVO的課程並不會突然使KVO的所有用途都有效。使用KVO可以將您完全綁定到操作,瞭解關鍵路徑,成爲觀察者,然後將您的兩個班級連接在一起。另一方面的通知很簡單;在你的操作中發佈它,給它的數據,以及應用程序中的其他內容... – dannywartnaby 2011-05-18 14:31:42

+0

我建議你再次閱讀我的評論,我從來沒有說過或暗示它「使KVO的所有用途有效」我只是指出,你說使用KVO「不明智」很具誤導性。想想你會使用KVO而不是通知;通知是粗粒度和廣播的,KVO意味着兩個對象之間的耦合。認爲操作的概念,它是一個原子工作片斷,創建它,某些東西可能需要監視它在做什麼以及什麼時候完成。如果應用程序需要知道發生了什麼Notify,如果客戶端只有KVO – GilesB 2011-05-18 20:23:35

-3

我不知道你的用例,但是使用KVO進行線程/操作並不明智。

您可以讓Operation對象在完成後發佈通知。或者,也可以定義一個委託協議,併爲您的操作指定一個委託...然後,您可以使用performSelectorOnMainThread定義某種'myOperationComplete:'方法,該方法由您的操作對其給定的委託調用。

+1

一切正常與KVO。我只是想問題,如果有的話。你說有一些問題。你能指出哪些是哪些? – 2010-04-09 16:49:05

+0

該操作可能會在調用「main」之前被取消。因此發佈通知涉及一些額外的工作。 GilesB指出: – Felix 2010-10-25 06:41:33

+1

downvoted,NSOperation使用KVO。 – lulu 2011-03-27 14:09:32