[objective-c] 04 - 消息机制 回调 目标-动作回调
?
本章主要講解回調(diào)的概述以及具有目標(biāo)-動(dòng)作回調(diào)接口的組件如何使用。
1.回調(diào)
回調(diào),也叫事件觸發(fā),在底層開(kāi)發(fā)中也就是服務(wù)或中斷服務(wù)。其產(chǎn)生過(guò)程較為復(fù)雜,所以我們?cè)诖瞬粫?huì)展開(kāi)講解。只是單純講解如何配置回調(diào)。
在使用一些較為復(fù)雜,或者和用戶(hù)有交互類(lèi)型的組件時(shí)。我們通常需要根據(jù)組件觸發(fā)的事件來(lái)做出相應(yīng)的響應(yīng)。
比如我們使用一個(gè)開(kāi)關(guān)控制一個(gè)燈。我們?cè)诰帉?xiě)代碼的時(shí)候并不能準(zhǔn)確的知道開(kāi)關(guān)的狀態(tài),也就無(wú)法確定燈的狀態(tài)。所以我們只能在開(kāi)關(guān)狀態(tài)發(fā)生改變的時(shí)候,獲取開(kāi)關(guān)的狀態(tài)且根據(jù)開(kāi)關(guān)的狀態(tài)對(duì)燈的狀態(tài)進(jìn)行改變。
這時(shí)候就需要開(kāi)關(guān)有一個(gè)能反饋?zhàn)陨頎顟B(tài)的機(jī)制。這種機(jī)制便成為回調(diào)機(jī)制。
我們?cè)诰幊讨锌梢酝ㄟ^(guò)回調(diào)機(jī)制讓代碼在運(yùn)行的過(guò)程中捕獲開(kāi)關(guān)狀態(tài)的改變點(diǎn),從而實(shí)現(xiàn)對(duì)燈的控制。
回調(diào)機(jī)制具體有三種表現(xiàn)形式:
下面我們展開(kāi)講解目標(biāo)-動(dòng)作回調(diào)。
2.目標(biāo)-動(dòng)作回調(diào)
目標(biāo):接收事件反饋的對(duì)象。比如開(kāi)關(guān)要反饋?zhàn)陨頎顟B(tài),此時(shí)接收反饋信息的對(duì)象便成為目標(biāo)。目標(biāo)對(duì)象為id類(lèi)型,因?yàn)樵谠O(shè)計(jì)開(kāi)關(guān)時(shí),并不知道開(kāi)關(guān)的使用者是什么類(lèi)型的對(duì)象。在代碼中通常用target來(lái)表示目標(biāo)對(duì)象。
動(dòng)作:事件反饋所要觸發(fā)的方法。比如開(kāi)關(guān)要反饋給我狀態(tài)改變的信息,在代碼中的具體表現(xiàn)形式為,通過(guò)調(diào)用我的某個(gè)方法來(lái)進(jìn)行告知。動(dòng)作對(duì)象為SEL類(lèi)型。
SEL類(lèi)型是OC語(yǔ)言為存儲(chǔ)方法名創(chuàng)造的變量類(lèi)型。同時(shí)還創(chuàng)造了一個(gè)運(yùn)算符,用于把一個(gè)方法名轉(zhuǎn)換成一個(gè)SEL值。
SEL test = @selector(方法名);在編程中,如果我們想使用開(kāi)關(guān),并且要根據(jù)開(kāi)關(guān)狀態(tài)的反饋?zhàn)龀霾煌奶幚?#xff0c;那么我們就需要設(shè)置開(kāi)關(guān)的反饋目標(biāo)和反饋動(dòng)作。
能夠設(shè)置反饋目標(biāo)和反饋動(dòng)作的組件我們稱(chēng)為具有目標(biāo)動(dòng)作回調(diào)接口的組件。
3.使用具有目標(biāo)動(dòng)作回調(diào)接口的組件
在真實(shí)情況下,具有目標(biāo)動(dòng)作接口的組件都是復(fù)雜類(lèi)組件。所以在本章講解中,使用虛擬的組件來(lái)進(jìn)行OC語(yǔ)法上的學(xué)習(xí)。
首先我們來(lái)了解兩個(gè)虛擬的組件,開(kāi)關(guān)和燈
燈的聲明文件
@interface Light : NSObject-(void)turnOff; // 開(kāi)燈 -(void)turnOn; // 關(guān)燈 @end可見(jiàn)燈的操作很簡(jiǎn)單,只有開(kāi)燈和關(guān)燈兩個(gè)方法。
開(kāi)關(guān)的聲明文件
typedef enum : NSUInteger {SwitchStateOff, // defaultSwitchStateOn, } SwitchState;@interface Switch : NSObject @property(nonatomic,assign,readonly)SwitchState currentState; -(void)addChangeStateTarget:(id)target Action:(SEL)action; @end開(kāi)關(guān)有一個(gè)只讀屬性,為當(dāng)前開(kāi)關(guān)的狀態(tài),其狀態(tài)變量為枚舉類(lèi)型
- SwitchStateOff 表示關(guān)閉狀態(tài)
- SwitchStateOn 表示開(kāi)啟狀態(tài)
開(kāi)關(guān)還有一個(gè)addChangeStateTarget方法,通過(guò)該方法為這個(gè)開(kāi)關(guān)設(shè)置反饋對(duì)象和反饋動(dòng)作,以實(shí)現(xiàn)讓反饋對(duì)象收到開(kāi)關(guān)狀態(tài)的改變信息。
下面我們假設(shè)有一個(gè)房間,房間中有一個(gè)開(kāi)關(guān)和一個(gè)燈。代碼實(shí)現(xiàn)如下:
@interface Room : NSObject@end @interface Room ()@property(nonatomic,strong) Light * aLight; @property(nonatomic,strong) Switch * aSwitch; -(void)changeState:(Switch *)s; @end @implementation Room - (instancetype)init { self = [super init]; if (self) { self.aLight = [[Light alloc] init]; self.aSwitch = [[Switch alloc] init]; //設(shè)置反饋對(duì)象和反饋方法 [self.aSwitch addChangeStateTarget:self Action:@selector(changeState:)]; } return self; } -(void)changeState:(Switch *)s { if (self.aSwitch.currentState == SwitchStateOff) { [self.light turnOn]; } else { [self.light turnOff]; } } @end上段代碼中我們依次做了如下事情
- 創(chuàng)建了一個(gè)Room類(lèi)的延展
- 在延展中聲明了燈和開(kāi)關(guān)的屬性
- 在初始化方法中為組件分配內(nèi)存
- 在初始化方法中設(shè)置組件反饋的目標(biāo)和反饋動(dòng)作
- 實(shí)現(xiàn)反饋方法中的具體處理邏輯
這樣當(dāng)代碼開(kāi)始運(yùn)行,開(kāi)關(guān)狀態(tài)被用戶(hù)改變之后,燈的狀態(tài)也會(huì)隨之改變。當(dāng)然,這段代碼是虛擬的。在之后章節(jié)中我們會(huì)接觸到可以真正運(yùn)行的代碼。還需要同學(xué)們努力學(xué)習(xí)。
轉(zhuǎn)載于:https://www.cnblogs.com/lqios/p/4272019.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的[objective-c] 04 - 消息机制 回调 目标-动作回调的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 简易多线程爬虫框架
- 下一篇: jquery评分效果Rating精华版