2009-08-15 13 views
4

我在KVO上銷售,但如果以明顯的方式使用,它是同步的。我希望在我連續發射很多KVO消息的情況下使用它,並導致我的應用程序在處理KVO消息時停下來。有人可以建議一種方法 - 可能使用NSOperationNSThread - 這將在這裏工作嗎?KVO岩石。現在我該如何異步使用它?

我的目標是在可能的情況下保留KVO的分離性和靈活性。

回答

0

看看NSNotification。這不是完全相同的事情,但你可以在後臺線程(通過一些研究和工作)發出通知。您可以保持良好的解耦和防火和遺忘行爲。

+0

感謝Adam。是的,NSNotification看起來比我的需求更適合KVO。乾杯。 – dugla 2009-08-17 13:48:13

+0

現在很容易與GCD(Grand Central Dispatch)異步使用KVO。 NSNotification的靈活性比KVO低得多,並且在許多情況下可能不是有效的替代品。 – mjmdavis 2012-04-12 14:07:54

13

KVO本質上是單線程的,因爲KVO通知將在與更改相同的線程上交付。

當然,UIKit和Cocoa都只是想讓你在主線程上做UI元素。因此,如果你在做異步操作,你很可能使用線程,如果是這樣,已經有一個同步問題,因爲你需要從某個線程獲取notifs到主線程。

其中關鍵在於。您可以在將更改通知傳遞給主線程之前合併變更通知,而不是盲目地轉發每個更改通知。

有多種方式可以做到這一點。最有可能的是,具體的解決方案對於你的應用來說將是非常獨特的。

就我個人而言,我儘量避免細粒度操作的合併和轉發。我發現告訴主線程一個特定的對象子圖已經改變了很簡單。更可能的是,繪製代碼將使用戶可見的更改需要重繪相關狀態,因此相關更改將自動反映出來。

正如你猜測的那樣,關鍵是要扼殺通知,以免讓應用程序的響應速度下降(或破壞設備的電池壽命)。

+0

bbum, 由於使用接待員模式。多說一點。我正在做一個圖形應用程序。大量的點擊,聲音f/x和視覺效果一直在發生。我的計劃是嚴重依賴KVO來根據特定行爲觸發聲音f/x。觸發器的聲音可以快速而激烈地發揮,每個人都可以玩超過一秒鐘。你會建議放棄KVO,並創建一個NSOperation實例用於併發 - 非阻塞聲音f/x? 乾杯, Doug – dugla 2009-08-16 15:08:16

相關問題