前言
在做新項目的時候時候,產品的要求是某一頁面在項目中以單例的形式存在的,單例頁面
的更新會受到單例對象
的某個屬性是不是發生變化而產生影響。如果單例對象
中的某個屬性在其他的頁面中發生了變化,單例頁面
需要根據這個單例對象
中的這個屬性的值的變化而發生頁面的更新。這個時候就需要單例頁面
用到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纔會有發通知給觀察者。