OC 觀察者模式(通知中心,KVO)

来源:http://www.cnblogs.com/xubaoaichiyu/archive/2016/05/28/5503263.html
-Advertisement-
Play Games

OC 觀察者模式(通知中心,KVO) 什麼是觀察者模式??? A對B的變化感興趣,就註冊為B的觀察者,當B發生變化時通知A,告知B發生了變化。這就是觀察者模式。 觀察者模式定義了一種一對多的依賴關係,讓多個觀察者對象同時監聽某一個主題對象。這個主題對象在狀態上發生變化時,會通知所有觀察者對象,使它們 ...


OC 觀察者模式(通知中心,KVO)


什麼是觀察者模式???

A對B的變化感興趣,就註冊為B的觀察者,當B發生變化時通知A,告知B發生了變化。這就是觀察者模式。
觀察者模式定義了一種一對多的依賴關係,讓多個觀察者對象同時監聽某一個主題對象。這個主題對象在狀態上發生變化時,會通知所有觀察者對象,使它們能夠自動更新自己或者做出相應的一些動作。在IOS開發中我們接觸到觀察者模式的實現方式有NSNotificationCenter、KVO等.

通知中心

以NSNotificationCenter為中心,觀察者往Center中註冊對某個主題對象的變化感興趣,主題對象通過NSNotificationCenter進行變化廣播。所有的觀察和監聽行為都向同一個中心註冊,所有對象的變化也都通過同一個中心向外廣播。

通知中心執行順序

  1. 通過NSNotificationCenter的addObserver:selector:name:object介面來註冊通知中心.
  2. 被觀察的對象,通過postNotificationName:object:userInfo:向通知中心發送某一類型通知.
  3. 當有通知來的時候,Center會調用觀察者註冊的介面來廣播通知,同時傳遞存儲著更改內容的NSNotification對象.
  4. 當該通知不再使用時,可以在dealloc方法里removeObserver:刪除觀察者.

KVO鍵值觀察

這是一個典型的觀察者模式,觀察者在鍵值改變時會得到通知.
NSKeyValueObserving非正式協議定義了一種機制,它允許對象去監聽其它對象的某個屬性的修改.NSObject提供了一個NSKeyValueObserving協議的預設實現,它為所有對象提供了一種自動發送修改通知的能力.我們可以通過禁用自動發送通知並使用這個協議提供的方法來手動實現通知的發送,以便更精確地去處理通知.

KVO的使用步驟

  • 註冊需要觀察的對象的屬性addObserver:forKeyPath:options:context:.
  • 實現observeValueForKeyPath:ofObject:change:context:方法,這個方法當觀察的屬性變化時會自動調用.在這個方法中還通過NSKeyValueObservingOptionNew這個參數要求把新值在dictionary中傳遞過來.
  • 取消註冊觀察removeObserver:forKeyPath:context:.

手動設置KVO

//關閉某key值的KVO

+ (BOOL)automaticallyNotifiesObserversForKey:(NSString *)key {
    
    BOOL automatic = YES;
    if ([key isEqualToString:@"age"]) {
        automatic = NO;
    } else {
        automatic = [super automaticallyNotifiesObserversForKey:key];
    }
    return automatic;
}

//重寫setter方法手動設置KVO

- (void)setAge:(int)age {
    
    //手動設置KVO
    
    if (_age != age) {
        
        [self willChangeValueForKey:@"age"];
        
        _age = age;
        
        [self didChangeValueForKey:@"age"];
        
    }
}

KVO的實現原理

當某一個類的實例第一次使用KVO的時候,系統就會在運行期間動態的創建該類的一個派生類,該類的命名規則一般是以NSKVONotifying為首碼,以原本的類名為尾碼。並且將原型的對象的isa指針指向該派生類。同時在派生類中重載了使用KVO的屬性的setter方法,在重載的setter方法中實現真正的通知機制,正如前面我們手動實現KVO一樣。這麼做是基於設置屬性會調用 setter 方法,而通過重寫就獲得了 KVO 需要的通知機制。當然前提是要通過遵循 KVO 的屬性設置方式來變更屬性值,如果僅是直接修改屬性對應的成員變數,是無法實現 KVO 的。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 學習要點: 1.搜索區 2.插入大圖 3.搜索框 主講教師:李炎恢 本章主要開始使用學慣用 HTML5 和 CSS3 來構建 Web 頁面,第一個項目採用 PC 端固定佈局來實現。 一.搜索區 本節課,我們接著 header 頭部往下,來設計一塊搜索區。這個區域,可以是廣告大圖,也可以是用戶註冊,也 ...
  • 效果:http://hovertree.com/texiao/jquery/71/代碼如下: 轉自:http://hovertree.com/h/bjaf/n781jmfy.htm 特效彙總:http://www.cnblogs.com/roucheng/p/texiao.html ...
  • 大圖:http://images2015.cnblogs.com/blog/730765/201605/730765-20160529113743209-72994369.png ...
  • 1. PCH文件概述 PCH文件是一種預編譯頭文件(一般擴展名為.PCH),是把一個工程中較穩定的代碼預先編譯好放在一個文件(.PCH)里。這些預先編譯好的代碼可以是任何的C/C++代碼--甚至可以是inline函數,只它們在整個工程中是較為穩定的,即在工程開發過程中不會經常被修改的代碼。 在 Xc ...
  • 看了很多別人寫的安卓SQlite數據的操作代碼,都是浮雲,瞎弄!一點也不通俗易懂,我覺得我寫的不錯,而且安卓項目也用上了,所以在博客園裡保存分享一下! 一SQLiteHelper類是自動重載增刪改查函數的,另外一個是自己定義的類,用Context傳值。我用的是Fragment,用Activity的話 ...
  • 此前編譯過Android4.4的源碼,但是現在Android都到了7.0的版本,不禁讓我感嘆Google的步伐真心難跟上,趁這周周末時間比較充裕,於是在過去的24小時里,毅然花了9個小時編譯了一把Android6.0的源碼,但是昨天編譯完之後已經很晚了,沒來得及記錄編譯的步驟,今天才慢悠悠地來記錄一 ...
  • 教你如何在 Android 使用多線程下載文件 =============================================== 前言 在 Android 日常開發中,我們會經常遇到下載文件需求,這裡我們也可以用系統自帶的 api 來解決這個問題,當然我們也可以自己來寫。在這裡我將教大 ...
  • 我們在使用手機的時候,經常會遇到一個問題:先是卡死,然後跳出該程式無響應,是否關閉的提示(當然有可能是我們手機性能太差=。=)這是因為線程的阻塞引起的,在這裡我講述一下UI線程,一般處理程式會在UI線程中執行耗時操作,這回導致UI線程阻塞,當UI線程阻塞,屏幕會出現卡死,用戶體驗會變得非常差,當線程 ...
一周排行
    -Advertisement-
    Play Games
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...
  • 目錄前言PostgreSql安裝測試額外Nuget安裝Person.cs模擬運行Navicate連postgresql解決方案Garnet為什麼要選擇Garnet而不是RedisRedis不再開源Windows版的Redis是由微軟維護的Windows Redis版本老舊,後續可能不再更新Garne ...
  • C#TMS系統代碼-聯表報表學習 領導被裁了之後很快就有人上任了,幾乎是無縫銜接,很難讓我不想到這早就決定好了。我的職責沒有任何變化。感受下來這個系統封裝程度很高,我只要會調用方法就行。這個系統交付之後不會有太多問題,更多應該是做小需求,有大的開發任務應該也是第二期的事,嗯?怎麼感覺我變成運維了?而 ...
  • 我在隨筆《EAV模型(實體-屬性-值)的設計和低代碼的處理方案(1)》中介紹了一些基本的EAV模型設計知識和基於Winform場景下低代碼(或者說無代碼)的一些實現思路,在本篇隨筆中,我們來分析一下這種針對通用業務,且只需定義就能構建業務模塊存儲和界面的解決方案,其中的數據查詢處理的操作。 ...
  • 對某個遠程伺服器啟用和設置NTP服務(Windows系統) 打開註冊表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer 將 Enabled 的值設置為 1,這將啟用NTP伺服器功 ...
  • title: Django信號與擴展:深入理解與實踐 date: 2024/5/15 22:40:52 updated: 2024/5/15 22:40:52 categories: 後端開發 tags: Django 信號 松耦合 觀察者 擴展 安全 性能 第一部分:Django信號基礎 Djan ...
  • 使用xadmin2遇到的問題&解決 環境配置: 使用的模塊版本: 關聯的包 Django 3.2.15 mysqlclient 2.2.4 xadmin 2.0.1 django-crispy-forms >= 1.6.0 django-import-export >= 0.5.1 django-r ...
  • 今天我打算整點兒不一樣的內容,通過之前學習的TransformerMap和LazyMap鏈,想搞點不一樣的,所以我關註了另外一條鏈DefaultedMap鏈,主要調用鏈為: 調用鏈詳細描述: ObjectInputStream.readObject() DefaultedMap.readObject ...
  • 後端應用級開發者該如何擁抱 AI GC?就是在這樣的一個大的浪潮下,我們的傳統的應用級開發者。我們該如何選擇職業或者是如何去快速轉型,跟上這樣的一個行業的一個浪潮? 0 AI金字塔模型 越往上它的整個難度就是職業機會也好,或者說是整個的這個運作也好,它的難度會越大,然後越往下機會就會越多,所以這是一 ...
  • @Autowired是Spring框架提供的註解,@Resource是Java EE 5規範提供的註解。 @Autowired預設按照類型自動裝配,而@Resource預設按照名稱自動裝配。 @Autowired支持@Qualifier註解來指定裝配哪一個具有相同類型的bean,而@Resourc... ...