iOS開發 通訊方式之KVO

2021-07-11 17:18:29 字數 2038 閱讀 8487

kvo即鍵值觀察者,它提供了乙個觀察者模式,用於監聽某個物件屬性值的變化,可以實現乙個觀察者,乙個被觀察者,多個接收者之間的通訊關係。

kvo的工作流程: 1.

被觀察者屬性發生變化(

child

物件的cleanvalue

發生變化) 2.

觀察者監聽到屬性的變化(

kvo幫我們實現了觀察者的業務邏輯) 3.

觀察者會呼叫觀察者方法通知到事件的接收者(觀察者通知到保姆) 4.

事件接收者響應這個事件。

在接收者類中新增小孩的觀察者,物件寫self,下面實現觀察者方法,其中改變小孩的相關屬性值,最後手動移除觀察者

1、新增觀察者的方法:

_child:

被觀察者

addobserver:

事件的接收者

options:

表示在觀察者方法的

change

引數中能夠獲取的值。

context:

傳遞的引數 [

_child

addobserver

:self

forkeypath

:@"cleanvalue"

options

:nskeyvalueobservingoptionnew

context

:null];

2、觀察者響應事件的方法:

//keypath:

被觀察者監聽的屬性名

//object:

被觀察者

//change:

是乙個字典,提供了關於

kvo的有效資訊,比如

key:new

時表示的是屬性變化後的新值,

key:old

表示的是屬性變化前的舊值

- (void

)observevalueforkeypath:(

nsstring

*)keypath ofobject:(

id)object change:(

nsdictionary

<

nsstring

*,id

> *)change context:(

void

*)context {}

舉例:小孩髒了,需要保姆來打理

給小孩新增乙個觀察者,事件的接收者是保姆,觀察者把小孩潔淨度這個屬性值傳遞到保姆,保姆去響應打理小孩的方法。

#import "child.h"

@implementation child

- (instancetype)init

[nstimer scheduledtimerwithtimeinterval:1 target:self selector:@selector(timeraction:) userinfo:nil repeats:yes];

return self;

}- (void)timeraction:(nstimer *)timer

@end

#import "nanny.h"

#import "child.h"

@implementation nanny

- (instancetype)initwithchild:(child *)child

return self;

}- (void)observevalueforkeypath:(nsstring *)keypath ofobject:(id)object change:(nsdictionary*)change context:(void *)context

}nsnumber *newvalue = change[@"new"];

if ([newvalue integervalue] < 90)

}//用kvo也實現了小孩和保姆之間的通訊,小孩可以脫離保姆而存在,進行解耦合,如果想換乙個照顧小孩的類,只要在類中新增觀察者,並且實現觀察者方法就可以。

}- (void)dealloc

@end

iOS開發 KVO觀察容器類

nsmutablearray nsmutabledictionary nsmutableset project型別為mac os x commandline tooles首先實現資料類,有三個屬性,分別是這三個集合類的物件 dataclass.h dataclass.h kvo qhy create...

iOS開發通訊知識

互動 通訊 過程 客戶端向伺服器發起請求,伺服器接收到請求之後,向客戶端作出相應.請求 客戶端向伺服器索要資料 相應 伺服器向客戶端返回資料 構建請求步驟 1.明確url,建立url,nsurl 2.建立請求 nsurlrequest 3.建立請求連線,發起請求 nsurlconnection 同步...

IOS之KVC和KVO 未完待續

kvc key value coding 作用 1 kvc可以給物件的私有變數賦值 2 用於字典轉模型 到後面用mjextension 3 通過kvc取出私有變數值 4 模型物件轉字典 了解 利用kvc賦值 利用kvc取值 使用注意 1 設定key keypath位置的字串必須保證有對應的屬性 或者...