控制器傳值,代理,監聽,通知中心…
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,
- @interface StockData : NSObject {
- NSString * stockName;
- float price;
- }
- @end
- @implementation StockData
- @end
2.定義此model為Controller的屬性,例項化它,監聽它的屬性,並顯示在當前的View裡邊
- - (void)viewDidLoad
- {
- [super viewDidLoad];
- stockForKVO = [[StockData alloc] init];
- [stockForKVO setValue:@"searph" forKey:@"stockName"];
- [stockForKVO setValue:@"10.0" forKey:@"price"];
- [stockForKVO addObserver:self forKeyPath:@"price" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:NULL];
- myLabel = [[UILabel alloc]initWithFrame:CGRectMake(100, 100, 100, 30 )];
- myLabel.textColor = [UIColor redColor];
- myLabel.text = [stockForKVO valueForKey:@"price"];
- [self.view addSubview:myLabel];
- UIButton * b = [UIButton buttonWithType:UIButtonTypeRoundedRect];
- b.frame = CGRectMake(0, 0, 100, 30);
- [b addTarget:self action:@selector(buttonAction) forControlEvents:UIControlEventTouchUpInside];
- [self.view addSubview:b];
- }
3.當點選button的時候,呼叫buttonAction方法,修改物件的屬性
- -(void) buttonAction
- {
- [stockForKVO setValue:@"20.0" forKey:@"price"];
- }
4. 實現回撥方法
- -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
- {
- if([keyPath isEqualToString:@"price"])
- {
- myLabel.text = [stockForKVO valueForKey:@"price"];
- }
- }
5.增加觀察與取消觀察是成對出現的,所以需要在最後的時候,移除觀察者
- - (void)dealloc
- {
- [super dealloc];
- [stockForKVO removeObserver:self forKeyPath:@"price"];
- [stockForKVO release];
- }
四,小結
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版本 制作服務端接收連接,客戶端連接功能 新增客戶端窗口打開時光標指向下邊文本域功能,使用WindowListener監聽WindowAdapter
內部 frame visible [] one exit eve awt dap 建一個服務端類ChatServer,用於設置端口接收連接 package com.swift; import java.io.IOException; import java.net.Se
Tomcat(介紹,JDK安裝,Tomcat安裝,配置Tomcat監聽80端口)
必須 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 View,item有監聽會導致劃不動的問題
出現這個問題可以Button來註冊監聽 protected void RegisterButtonEvent(Button btn, UnityAction btnEvent) { if (null == btn) {
Spring監聽,ApplicationListener
import java.util.HashMap; import java.util.Map; import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; importorg.springframewo
vue.js watch監聽,vue.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