iOS 觀察者模式—KVO

什么是觀察者模式?

觀察者模式.png

觀察者模式是定義對象間的一種一對多的依賴關(guān)系,并且當(dāng)一個對象的狀態(tài)發(fā)生改變的時候,所有依賴于它的對象都會得到通知且自動更新。

iOS中實現(xiàn)觀察者模式有兩種方式:通知和KVO

  • 先了解KVO

我所理解的是KVO,一個是觀察者,一個是被觀察者,當(dāng)然自己觀察自己也是可以的,就像自我反省一樣。觀察者對被觀察者的某個屬性感興趣,就把注意力放在這個屬性上,當(dāng)這個屬性發(fā)生變化時,觀察者就根據(jù)這個屬性變化作出相對應(yīng)的措施。至于什么措施,就因人而異啦??!

  • 用一下吧
//用于觀察的屬性
@property (nonatomic, assign)  NSInteger  weekNum;//星期幾

//賦初始值
 self.weekNum = 1;

//給自己添加觀察者,觀察自己的weekNum屬性
 [self addObserver:self forKeyPath:@"weekNum" options:NSKeyValueObservingOptionNew context:nil];

NSKeyValueObservingOptionNew 通知中發(fā)送的更改字典包含新值
NSKeyValueObservingOptionOld 舊值
_weekNum 與 self.weekNum的區(qū)別
使用self.XXX 會調(diào)用set和get方法,而_XXX則直接訪問實例變量并賦值,不會調(diào)用set和get方法
KVO觀察屬性!其實是觀察set方法!!

  • 改變值
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
     self.weekNum++;
}
  • 屬性變化調(diào)用
#pragma -mark ——————————監(jiān)聽值變化-——————————
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context
{
    if ([keyPath isEqualToString:@"weekNum"]) {
        NSLog(@"%@",[object valueForKey:@"weekNum"]);
        NSLog(@"--change:--%@", [change objectForKey:@"new"]);
     //做對應(yīng)的操作
    }
}
  • 最后別忘了移除
- (void)dealloc
{
    //移除觀察者
    [self removeObserver:self forKeyPath:@"weekNum"];
}

添加觀察者前后類的變化

打印isa指針指向的類

NSLog(@"isa-> %@", object_getClass(self));

添加前 :isa-> YHObserverPracticeVC
添加后:isa-> NSKVONotifying_YHObserverPracticeVC
移除后:isa-> YHObserverPracticeVC

  • 由此可見,觀察的時候,動態(tài)的生成一個前綴為NSKVONotifying_+類名的子類,觀察的是這個新生成類的set方法
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,665評論 1 32
  • 上一篇:iOS-KVC淺談 前言:KVO 作為 KVC 的同袍兄弟,功能更強大,聊聊 KVO。 一、KVO 簡介 ...
    夢蕊dream閱讀 822評論 0 0
  • 問題 iOS用什么方式實現(xiàn)對一個對象的KVO?(KVO的本質(zhì)是什么?) 如何手動觸發(fā)KVO ? 首先需要了解KVO...
    hjltony閱讀 627評論 0 2
  • KVC KVC定義 KVC(Key-value coding)鍵值編碼,就是指iOS的開發(fā)中,可以允許開發(fā)者通過K...
    暮年古稀ZC閱讀 2,292評論 2 9
  • 上半年有段時間做了一個項目,項目中聊天界面用到了音頻播放,涉及到進度條,當(dāng)時做android時候處理的不太好,由于...
    DaZenD閱讀 3,101評論 0 26

友情鏈接更多精彩內(nèi)容