2010-08-15 59 views
2

我有一大堆模型可以監視自己的變化。當設置者被觸發時,模型中的觀察者被調用,並且在該模型中,我調用Web服務器並更新Web服務器中的信息,以便它正確地具有它應該的數據。當從模型設置器發起KVO時,防止重新輸入observeValueForKeypath

但是,在我對Web服務器的調用中,我可以從連接被丟棄,服務器重置等到服務器返回一個錯誤,告訴服務器不允許更新(例如,其他用戶更改的某些其他參數阻止更新)。

哦斷開連接的數據存儲的樂趣...

有沒有辦法,我可以沒有它重新觸發一個志願行動更新self(即模型)什麼辦法?

當我收回響應時,我可以關閉觀察者,但在執行後臺服務器請求時可以對同一對象執行另一個用戶操作。然後這將打破另一個電話。

請參閱文章here瞭解我正在嘗試如何讓觀察結果首先發生,以及完整模型的代碼示例。

在那裏我正在通話將是觀察者如下部分:

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

    if ([keyPath isEqual:@"firstName"]) { 

    if !([serverCall value:[change objectForKey:NSKeyValueChangeNewKey] 
        forKey:@"firstName"]) { 

     // Notify the user of the problem and somehow do a 
     // [self setFirstName:[change objectForKey:NSKeyValueChangeOldKey]] 
     // without firing off a KVO which would only loop this process 
    } 
    } 

    if ([keyPath isEqual:@"lastName"]) { 
    // Do whatever I need to do 
    } 
} 

你們似乎總是對一些好的建議來通過,我永遠爲你可能有任何建議表示感謝。

+0

嗨,你對KVO瞭解多少?你知道什麼觸發了通知發送? – hooleyhoop 2010-08-15 09:50:41

+0

我很確定我明白什麼會觸發通知,但我不確定這與我的問題有什麼關係。 – Hooligancat 2010-08-15 21:57:36

+0

嗯,這只是一個想法 - 你可以有一個額外的設置每個屬性,沒有觸發通知。我可以看到你可能不想那麼做。 – hooleyhoop 2010-08-15 22:15:42

回答

2

那麼我最終採取了不同的方式。我不再依賴對象模型發佈更新,而是將所有內容都提升到一個級別,並讓控制器處理更新。

本質過程如下:

  1. 當需要
  2. 有在控制器中的設置器,在一個方法變量保持的對象設置的當前狀態中創建模型中的對象
  3. 將新設置傳遞給服務器,但只有那些在現有設置和新設置之間更改的設置(所有增量值)
  4. 如果調用通過,請更新模型,或者如果失敗,通知用戶並且不執行任何操作更多

它在每個控制器中都是多一點代碼,但是通過動態地將當前值與新值進行比較,並只傳遞已更改到服務器的值,我完成了相同的淨結果。

這使我可以根據多少次更改值來傳遞一個值,而不必硬編碼setter和getter,並且一次又一次地調用一個通用的服務器API方法。

實際效果是,我保留了所有KVC/KVO通知,而不用擔心繞過它,或者不在某些通話中對其進行KVC/KVO更新,而對其他通話不進行更新。

相關問題