1. 程式人生 > >控制器傳值,代理,監聽,通知中心…

控制器傳值,代理,監聽,通知中心…

1.通知中心 

通知中心實際上是在程式內部提供了訊息廣播的一種機制。通知中心不能在程序間進行通訊。實際上就是一個二傳手,把接收到的訊息,根據內部的一個訊息轉發表,來將訊息轉發給需要的物件。通知中心是基於觀察者模式的,它允許註冊、刪除觀察者    通知中心如何使用 

通知中心的使用可以分為4個步驟。 

這裡需要額外提一點的是:傳送訊息不僅僅可以有使用者發起,也可以是系統發起。 

當我們註冊了某個訊息的觀察者後,如果有了對應的訊息,則觀察者會收到相應的訊息,並展開處理。這裡需要注意的是,當使用完訊息之後,不想在接收到訊息,則需要把觀察者移除,否則會出現錯誤。註冊通知:即要在什麼地方接受訊息 

[[NSNotificationCenter defaultCenter]  addObserver:self selector:@selector (mytest:) name:@" postData " object:nil]; 

引數介紹: 

addObserver:觀察者,即在什麼地方接收通知; 

selector:收到通知後呼叫何種方法,即回撥函式; 

name:通知的名字,也是通知的唯一標示,編譯器就通過這個找到通知的。 

傳送通知:呼叫觀察者處的方法。 

[[NSNotificationCenter defaultCenter] postNotificationName:@" postData " object:searchFriendArray]; 

2.代理 

delegate最常用,就不寫了 

一,概述

KVO,即:Key-Value Observing,它提供一種機制,當指定的物件的屬性被修改後,則物件就會接受到通知。簡單的說就是每次指定的被觀察的物件的屬性被修改後,KVO就會自動通知相應的觀察者了。

二,使用方法

系統框架已經支援KVO,所以程式設計師在使用的時候非常簡單。

1. 註冊,指定被觀察者的屬性,

2. 實現回撥方法

3. 移除觀察

三,例項:

假設一個場景,股票的價格顯示在當前螢幕上,當股票價格更改的時候,實時顯示更新其價格。

1.定義DataModel,

  1. @interface StockData : NSObject {  
  2.     NSString * stockName;  
  3.     float price;  
  4. }  
  5. @end  
  6. @implementation StockData  
  7. @end  

2.定義此model為Controller的屬性,例項化它,監聽它的屬性,並顯示在當前的View裡邊

  1. - (void)viewDidLoad  
  2. {  
  3.     [super viewDidLoad];  
  4.     stockForKVO = [[StockData alloc] init];  
  5.     [stockForKVO setValue:@"searph" forKey:@"stockName"];  
  6.     [stockForKVO setValue:@"10.0" forKey:@"price"];      
  7.     [stockForKVO addObserver:self forKeyPath:@"price" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:NULL];  
  8.     myLabel = [[UILabel alloc]initWithFrame:CGRectMake(100, 100, 100, 30 )];  
  9.     myLabel.textColor = [UIColor redColor];  
  10.     myLabel.text = [stockForKVO valueForKey:@"price"];  
  11.     [self.view addSubview:myLabel];  
  12.     UIButton * b = [UIButton buttonWithType:UIButtonTypeRoundedRect];  
  13.     b.frame = CGRectMake(0, 0, 100, 30);  
  14.     [b addTarget:self action:@selector(buttonAction) forControlEvents:UIControlEventTouchUpInside];  
  15.     [self.view addSubview:b];  
  16. }  

3.當點選button的時候,呼叫buttonAction方法,修改物件的屬性

  1. -(void) buttonAction  
  2. {  
  3.     [stockForKVO setValue:@"20.0" forKey:@"price"];  
  4. }  

4. 實現回撥方法

  1. -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context  
  2. {  
  3.     if([keyPath isEqualToString:@"price"])  
  4.     {  
  5.         myLabel.text = [stockForKVO valueForKey:@"price"];  
  6.     }  
  7. }  

5.增加觀察與取消觀察是成對出現的,所以需要在最後的時候,移除觀察者

  1. - (void)dealloc  
  2. {  
  3.     [super dealloc];  
  4.     [stockForKVO removeObserver:self forKeyPath:@"price"];  
  5.     [stockForKVO release];  
  6. }  

四,小結

KVO這種編碼方式使用起來很簡單,很適用與datamodel修改後,引發的UIVIew的變化這種情況,就像上邊的例子那樣,當更改屬性的值後,監聽物件會立即得到通知。

KVC

一,概述

KVC是KeyValueCoding的簡稱,它是一種可以直接通過字串的名字(key)來訪問類屬性的機制。而不是通過呼叫Setter、Getter方法訪問。

當使用KVO、Core Data、CocoaBindings、AppleScript(Mac支援)時,KVC是關鍵技術。 

二,使用方法

關鍵方法定義在:NSKeyValueCodingprotocol

KVC支援類物件和內建基本資料型別。

 獲取值

valueForKey:,傳入NSString屬性的名字。

valueForKeyPath:,傳入NSString屬性的路徑,xx.xx形式。

valueForUndefinedKey它的預設實現是丟擲異常,可以重寫這個函式做錯誤處理。

  修改值

setValue:forKey:

setValue:forKeyPath:

setValue:forUndefinedKey:

setNilValueForKey:當對非類物件屬性設定nil時,呼叫,預設丟擲異常。

 一對多關係成員的情況

mutableArrayValueForKey:有序一對多關係成員  NSArray

mutableSetValueForKey:無序一對多關係成員  NSSet

三,例項:

1.    1 .Person類 

2.    @implementation Person 

3.    @synthesize name,age;//屬性name 將被監視 

4.    -(void) changeName 

5.    { 

6.        [email protected]"changeName directly"; 

7.    } 

8.    @end 

9.     

10.  

11. 2.PersonMonitor類  監視了name屬性 

12. @implementation PersonMonitor 

13.  

14. - (void)observeValueForKeyPath:(NSString *)keyPath 

15.                       ofObject:(id)object 

16.                         change:(NSDictionary *)change 

17.                        context:(void *)context 

18. { 

19.     if ([keyPath isEqual:@"name"]) 

20.     { 

21.         NSLog(@"change happen, old:%@   new:%@",[change objectForKey:NSKeyValueChangeOldKey],[change objectForKey:NSKeyValueChangeNewKey]); 

22.     } 

23. } 

24. @end 

25.  

26.  

27. 3測試程式碼 

28.  

29.    //初始化被監視物件

30.     Person *p =[[Person alloc] init]; 

31.    //監視物件 

32.    PersonMonitor *pm= [[PersonMonitor alloc]init]; 

33.     [p addObserver:pm forKeyPath:@"name" options:(NSKeyValueObservingOptionNew |NSKeyValueObservingOptionOld) context:nil]; 

34.    

35. //測試前的資料

36.     NSLog(@"p.name is %@",p.name); 

37.     

38. //通過setvalue 的方法,PersonMonitor的監視將被呼叫

39.   [p setValue:@"name kvc" forKey:@"name"]; 

40.   

41. //檢視設定後的值

42.    NSLog(@"p name get by kvc is %@",[p valueForKey:@"name"]); 

43.  

44. //效果和通過setValue 是一致的    

45. [email protected]"name change by .name="; 

46.  

47.  //通過person自己的函式來更改name 

48.      [p changeName];  

49.  

50.  結果是 

51. 輸出 

52. 2011-07-03 16:35:57.406 Cocoa[13970:903] p.name is name 

53. 2011-07-03 16:35:57.418 Cocoa[13970:903] change happen, old:name   new:name kvc 

54. 2011-07-03 16:35:57.420 Cocoa[13970:903] p name get by kvc is name kvc 

55. 2011-07-03 16:35:57.421 Cocoa[13970:903] change happen, old:name kvc   new:name change by .name= 

56. 最後一次修改是直接修改  所以沒法產生通知

四,小結

KVO/KVC這種編碼方式使用起來很簡單,很適用與datamodel修改後,引發的UIVIew的變化這種情況,就像上邊的例子那樣,當更改屬性的值後,監聽物件會立即得到通知。

相關推薦

淺析VUE雙向繫結原理實現資料通知訂閱者

淺析VUE雙向繫結原理,實現屬性變化的監聽 本文引用了“鄧木琴居然被盜用了”的文章內容,博文地址: https://segmentfault.com/a/1190000006599500一、VUE雙向繫結原理簡單介紹 Vue的雙向繫結是通過資料劫持結合釋出-訂閱者模式實

控制器代理通知中心

1.通知中心  通知中心實際上是在程式內部提供了訊息廣播的一種機制。通知中心不能在程序間進行通訊。實際上就是一個二傳手,把接收到的訊息,根據內部的一個訊息轉發表,來將訊息轉發給需要的物件。通知中心是基於觀察者模式的,它允許註冊、刪除觀察者    通知中心如何使用  通知中心的使用可以分為4個步驟。 

oracle11G 已開啟但遠程連接依舊無解決過程

無法 無法啟動 col min 進入 排查 安裝 ner start 1、連接數據庫顯示無監聽程序,首先查看服務器的oracle監聽服務是否開啟,服務名稱:OracleOraDb11g_home1TNSListener(具體環境中可能不完全一樣,但是認準TNSListene

js中添加判斷是什麽事件

什麽 contain 添加 current src ner type $apply test window.addEventListener(‘message‘, function (event) { if (event.data.type === "

java在線聊天項目0.4版本 制作服務端接收連接客戶端連接功能 新增客戶端窗口打開時光標指向下邊文本域功能使用WindowListenerWindowAdapter

內部 frame visible [] one exit eve awt dap 建一個服務端類ChatServer,用於設置端口接收連接 package com.swift; import java.io.IOException; import java.net.Se

Tomcat(介紹JDK安裝Tomcat安裝配置Tomcat80端口)

必須 bin rgb 命令 mct local bak $path 系統 一、Tomcat介紹目前有很多網站是用Java編寫的,所以解析Java程序就必須有相關的軟件來完成,Tomcat就是其中之一Tomcat是Apache軟件基金會,的Jakarta項目中的一個核心項目,

SVN開啟端口並設置開機啟動

監聽端口 啟動 port epo -- clas 倉庫 XP 設置 svnserve -d -r /home/svn/repo --listen-port=3690,svn倉庫地址,及監聽端口 vi svn_startup.sh,位置在/root下面編輯一個啟動腳本

圖形用戶界面之添加實例化

IT main round ID end AD generated 圖片 ima package 圖形用戶界面1;import java.awt.*;//import java.awt.event.ActionEvent;//import java.awt.event.Wi

實現滾輪導航欄置頂的效果。

nav idt ack doc color win ID cti col 為了項目的制作,需要一個導航欄置頂的效果,遇到了點難度,但還是克服了,通過比較導航和滾動條的高度實現置頂效果 <div id="daohang" style="width:100%;heig

Curator之nodeCache一次註冊N次

Curator之nodeCache一次註冊,N次監聽 /*Curator之nodeCache一次註冊,N次監聽*/ //為節點新增watcher //監聽資料節點的變更,會觸發事件 final NodeCache nodeCache =

React和Vue中是如何變數變化的

React 中 本地除錯React程式碼的方法 先將React程式碼下載到本地,進入專案資料夾後yarn build 利用create-react-app建立一個自己的專案 把react原始碼和自己剛剛建立的專案關聯起來,之前build原始碼到build資料夾下面,然後cd到react資料夾

事件回撥事件

一、事件監聽涉及到三個類物件 1、EventSource(事件源)事件發生的場所 2、Event(事件):事件封裝介面元件上面發生的特定事件 3、EventListener(事件監聽器):負責監聽事件源發生的事件     二、監聽器就是程式中的MyC

RAC中Voting disk OCR有關命令的整理

使用crsctl 命令來檢查CRS資源狀態 #./crsctl status resource -t GI(grid Infrastructure)在ASM下固定的三種類型的檔案存在 Oracle叢集的註冊檔案 OCR 表決檔案 VOTE File ASM例項的共享SPFILE檔案

數據庫安全檢查是重點設置密碼

quit proto change rod 方法 1.2 uri tro oca Oracle 數據庫監聽的安全管理是比較容易忽略的一個問題,做一個測試禁用監聽的本地驗證功能,設置監聽密碼,數據庫版本為11.2.0.4 1、默認配置listener.ora LISTENER

html鍵盤事件

<script type="text/javascript" language=JavaScript charset="UTF-8">      var isPiss=0; document.onkeydown=functi

UGUI使用Scroll Viewitem有會導致劃不動的問題

出現這個問題可以Button來註冊監聽 protected void RegisterButtonEvent(Button btn, UnityAction btnEvent)    {        if (null == btn) {

SpringApplicationListener

import java.util.HashMap; import java.util.Map; import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; importorg.springframewo

vue.js watchvue.js watch

vue.js watch監聽,vue.js 監聽watch     ================================ ©Copyright 蕃薯耀 2018年12月06日 http://fanshuyao.iteye.com/   <

Redis實現key過期並操作redis的多個數據庫整合到SpringBoot

最近來了個新的需求,需要使用定時器完成,本想以為用個@Scheduled()就輕易搞定的,詳細瞭解後,事情卻並沒有這麼簡單......。所以接到需求後,需要找產品明確明確再次明確,才開工,不然的話你本以為做好的工作卻是一場空。 業務場景邏輯解析:第一個請求進來,需要把請求引

springboot專案之controller層通過Model物件到對應的返回頁面返回頁面通過thymeleaf模板引擎來接收傳來的

1.controller層的方法接收到請求後將返回borrowingBooks.html頁面,並將一個List物件res的值傳遞到borrowingBooks.html頁面。 @Controller