RACCommand : RAC中用于處理事件的類漠嵌,可以把事件如何處理,事件中的數(shù)據(jù)如何傳遞哼拔,包裝到這個(gè)類中嚼黔,他可以很方便的監(jiān)控事件的執(zhí)行過(guò)程细层。
使用場(chǎng)景:監(jiān)聽(tīng)按鈕點(diǎn)擊惜辑,網(wǎng)絡(luò)請(qǐng)求
-
RACCommand簡(jiǎn)單使用
- 一、RACCommand使用步驟:
- 創(chuàng)建命令
initWithSignalBlock:(RACSignal * (^)(id input))signalBlock
- 在signalBlock中疫赎,創(chuàng)建RACSignal盛撑,并且作為signalBlock的返回值
- 創(chuàng)建命令
- 執(zhí)行命令
- (RACSignal *)execute:(id)input
- 一、RACCommand使用步驟:
二、RACCommand使用注意:
- signalBlock必須要返回一個(gè)信號(hào)捧搞,不能傳nil.
- 如果不想要傳遞信號(hào)抵卫,直接創(chuàng)建空的信號(hào)[RACSignal empty];
- RACCommand中信號(hào)如果數(shù)據(jù)傳遞完,必須調(diào)用[subscriber sendCompleted]胎撇,這時(shí)命令才會(huì)執(zhí)行完畢介粘,否則永遠(yuǎn)處于執(zhí)行中。
- 三晚树、RACCommand設(shè)計(jì)思想:
內(nèi)部signalBlock為什么要返回一個(gè)信號(hào)姻采,這個(gè)信號(hào)有什么用。
- 在RAC開(kāi)發(fā)中爵憎,通常會(huì)把網(wǎng)絡(luò)請(qǐng)求封裝到RACCommand慨亲,直接執(zhí)行某個(gè)RACCommand就能發(fā)送請(qǐng)求。
- 當(dāng)RACCommand內(nèi)部請(qǐng)求到數(shù)據(jù)的時(shí)候宝鼓,需要把請(qǐng)求的數(shù)據(jù)傳遞給外界巡雨,這時(shí)候就需要通過(guò)signalBlock返回的信號(hào)傳遞了。
- 四席函、如何拿到RACCommand中返回信號(hào)發(fā)出的數(shù)據(jù)。
> 1. RACCommand有個(gè)執(zhí)行信號(hào)源`executionSignals`冈涧,這個(gè)是signal of signals(信號(hào)的信號(hào)),意思是信號(hào)發(fā)出的數(shù)據(jù)是信號(hào)茂附,不是普通的類型。
- 訂閱executionSignals就能拿到RACCommand中返回的信號(hào)督弓,然后訂閱signalBlock返回的信號(hào)营曼,就能獲取發(fā)出的值。
五愚隧、監(jiān)聽(tīng)當(dāng)前命令是否正在執(zhí)行executing
六蒂阱、使用場(chǎng)景,監(jiān)聽(tīng)按鈕點(diǎn)擊,網(wǎng)絡(luò)請(qǐng)求
代碼如下:
// 1.創(chuàng)建命令
RACCommand *command = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) {
NSLog(@"執(zhí)行命令");
// 創(chuàng)建空信號(hào),必須返回信號(hào)
// return [RACSignal empty];
// 2.創(chuàng)建信號(hào),用來(lái)傳遞數(shù)據(jù)
return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
[subscriber sendNext:@"請(qǐng)求數(shù)據(jù)"];
// 注意:數(shù)據(jù)傳遞完狂塘,最好調(diào)用sendCompleted录煤,這時(shí)命令才執(zhí)行完畢。
[subscriber sendCompleted];
return nil;
}];
}];
// 強(qiáng)引用命令荞胡,不要被銷毀妈踊,否則接收不到數(shù)據(jù)
_conmmand = command;
// 3.執(zhí)行命令
[self.conmmand execute:@1];
// 4.訂閱RACCommand中的信號(hào)
[command.executionSignals subscribeNext:^(id x) {
[x subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
}];
// RAC高級(jí)用法
// switchToLatest:用于signal of signals,獲取signal of signals發(fā)出的最新信號(hào),也就是可以直接拿到RACCommand中的信號(hào)
[command.executionSignals.switchToLatest subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
// 5.監(jiān)聽(tīng)命令是否執(zhí)行完畢,默認(rèn)會(huì)來(lái)一次泪漂,可以直接跳過(guò)廊营,skip表示跳過(guò)第一次信號(hào)歪泳。
[[command.executing skip:1] subscribeNext:^(id x) {
if ([x boolValue] == YES) {
// 正在執(zhí)行
NSLog(@"正在執(zhí)行");
}else{
// 執(zhí)行完成
NSLog(@"執(zhí)行完成");
}
}];