主動呼叫KVO(NSKeyValueObserverNotification)

前言

在做新項目的時候時候,產品的要求是某一頁面在項目中以單例的形式存在的,單例頁面的更新會受到單例對象的某個屬性是不是發生變化而產生影響。如果單例對象中的某個屬性在其他的頁面中發生了變化,單例頁面需要根據這個單例對象中的這個屬性的值的變化而發生頁面的更新。這個時候就需要單例頁面用到KVO來進行監聽單例對象中的屬性。

解決方案

最初的實現

以下是單例對象中的某屬性的set方法:

- (void)setValue:(NSString *)value
{
    _value = value;
} 

遇到的問題,以及解決方案

但是在開發的過程中會發現,value這個property完全不會被單例頁面監聽到,即使用了KeyPath也是相同的。這時候公司PM給我出了個主意。就是主動地去呼叫,發通知給監聽者單例頁面

- (void)setValue:(NSString *)value
{
    [self willChangeValueForKey:@"value"];
    _value = value;
    [self didChangeValueForKey:@"value"];
}

KVO沒有監聽到的原因

在最後的刨根問底解決問題的精神驅使下,找到了KVO爲什麼沒有監聽到屬性變化的原因了。代碼中重寫了value的set方法_value = value;,這麼做KVO是兼聽不到值得變化的。只有通過·self.value = xxxValue;`KVO纔會有發通知給觀察者。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章