作品鏈接:http://www.reibang.com/users/1e0f5e6f73f6/top_articles
RACCommand
:RAC中用于處理事件的類罕容,可以把事件如何處理,事件中的數(shù)據(jù)如何傳遞膀值,包裝到這個類中族沃,他可以很方便的監(jiān)控事件的執(zhí)行過程。
使用場景
:監(jiān)聽按鈕點擊旋炒,網(wǎng)絡(luò)請求
一步悠、RACCommand使用步驟:
1.創(chuàng)建命令 initWithSignalBlock:(RACSignal * (^)(id input))signalBlock
2.在signalBlock中,創(chuàng)建RACSignal瘫镇,并且作為signalBlock的返回值
3.執(zhí)行命令 - (RACSignal *)execute:(id)input
二鼎兽、RACCommand使用注意:
1.signalBlock必須要返回一個信號,不能傳nil.
2.如果不想要傳遞信號汇四,直接創(chuàng)建空的信號[RACSignal empty];
3.RACCommand中信號如果數(shù)據(jù)傳遞完,必須調(diào)用[subscriber sendCompleted]踢涌,這時命令才會執(zhí)行完畢通孽,否則永遠處于執(zhí)行中。
三睁壁、RACCommand設(shè)計思想:內(nèi)部signalBlock為什么要返回一個信號背苦,這個信號有什么用。
1.在RAC開發(fā)中潘明,通常會把網(wǎng)絡(luò)請求封裝到RACCommand行剂,直接執(zhí)行某個RACCommand就能發(fā)送請求。
2.當RACCommand內(nèi)部請求到數(shù)據(jù)的時候钳降,需要把請求的數(shù)據(jù)傳遞給外界厚宰,這時候就需要通過signalBlock返回的信號傳遞了。
四遂填、如何拿到RACCommand中返回信號發(fā)出的數(shù)據(jù)铲觉。
1.RACCommand有個執(zhí)行信號源executionSignals,這個是signal of signals(信號的信號),意思是信號發(fā)出的數(shù)據(jù)是信號吓坚,不是普通的類型撵幽。
2.訂閱executionSignals就能拿到RACCommand中返回的信號,然后訂閱signalBlock返回的信號礁击,就能獲取發(fā)出的值盐杂。
五、監(jiān)聽當前命令是否正在執(zhí)行executing
六哆窿、使用場景,監(jiān)聽按鈕點擊链烈,網(wǎng)絡(luò)請求
七、代碼
// 1.創(chuàng)建命令
RACCommand *command = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) {
NSLog(@"執(zhí)行命令");
// 創(chuàng)建空信號,必須返回信號
// return [RACSignal empty];
// 2.創(chuàng)建信號,用來傳遞數(shù)據(jù)
return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
[subscriber sendNext:@"請求數(shù)據(jù)"];
// 注意:數(shù)據(jù)傳遞完挚躯,最好調(diào)用sendCompleted测垛,這時命令才執(zhí)行完畢。
[subscriber sendCompleted];
return nil;
}];
}];
// 強引用命令秧均,不要被銷毀食侮,否則接收不到數(shù)據(jù)
_conmmand = command;
// 3.執(zhí)行命令
[self.conmmand execute:@1];
// 4.訂閱RACCommand中的信號
[command.executionSignals subscribeNext:^(id x) {
[x subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
}];
// RAC高級用法
// switchToLatest:用于signal of signals号涯,獲取signal of signals發(fā)出的最新信號,也就是可以直接拿到RACCommand中的信號
[command.executionSignals.switchToLatest subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
// 5.監(jiān)聽命令是否執(zhí)行完畢,默認會來一次,可以直接跳過锯七,skip表示跳過第一次信號链快。
[[command.executing skip:1] subscribeNext:^(id x) {
if ([x boolValue] == YES) {
// 正在執(zhí)行
NSLog(@"正在執(zhí)行");
}else{
// 執(zhí)行完成
NSLog(@"執(zhí)行完成");
}
}];