2012-03-15 81 views
1

我正在爲微控制器中的大學課程做UI。它是用於控制不同房間溫度的溫度控制器的用戶界面。對於每個房間,我都有一個RoomViewController(NSViewController子類)的實例,它管理着一個相應的視圖,該視圖顯示了用戶可以更改的當前溫度和目標溫度。如何防止遞歸KVO通知?

我的意圖是使用Cocoa綁定將目標溫度顯示的值綁定到RoomViewController中的一個屬性,然後讓另一個類監聽這些屬性以通過串行將這些更新發送到微控制器。問題是,改變也可能來自微控制器,這意味着我必須以編程方式設置屬性,因爲來自微控制器的事件。這會導致一個屬性更改通知,導致更改MCU中的值,這會導致來自MCU的事件,這會導致屬性更改等。它會變成一個無限循環。

如何避免KVO中的反饋迴路?

回答

0

測試(你說,這是一所大學的類!):

一)是否在志願更改通知設置屬性爲當前值的結果?

b)如果你沒有改變你的財產,如果新的價值將是一樣的,這將打破你的週期從MCU接收事件?

c)想想你可以做的另一個測試!

評論響應

我假設你已經測試(一)&(B),發現他們不這樣做,你需要什麼。所以也許你所追求的是一個擁有兩名制定者的單一財產?一個setter觸發KVO另一個不...

現在你談論的溫度,所以你的財產大概是一些數字類型。它是一個包裝號碼,如NSNumber或原始號碼,如double

讓我們假設後者作爲前者是(很多)更多的參與!

所以:

  1. 你有一個數字,說double,屬性由相同類型的實例變量的支持。
  2. 你已經@syntheize屬性有編譯器創建一個setter和一個getter,它可以改變/檢索那個實例變量中的值。
  3. 您正在使用KVO來使用setter。
  4. 而且您希望能夠在不觸發KVO的情況下設置屬性。
  5. 而對於原始的數字財產的所有二傳手需要做的是設置實例變量...

問題解決了。好?

+0

由於來自MCU的事件,我不希望完全生成屬性更改事件。如果MCU告訴我值已經改變,我不希望發送屬性更改事件,因爲這會導致應用程序更改剛剛報告的MCU中的值,這是不必要的。只有當用戶手動編輯值時,纔會發生更改事件。但是也許KVO不能以這種方式使用。 – 2012-03-15 09:48:14