前言
書接上回,上回講到了RAC的基本概念還有基礎的類,相信大家有一定的印象了。可能有很多人說還不懂怎么應用,或者有點理解不透徹。表著急,現在我就一點一點從簡單應用開始,配合代碼,給大家一點明確的講解,告訴大家RAC的部分簡單應用,作為今天的第二天課程。
RACSubject簡單應用
1. RACSubject的使用步驟
2. RACSubject替換代理
需求邏輯:頁面一有一個按鈕,點擊按鈕,跳轉到頁面二。頁面二也有個按鈕,點擊頁面二的按鈕,頁面一接收到按鈕被點擊的事件。
3.RACCommand
RAC中用于處理事件的類,可以把事件如何處理,事件中的數據如何傳遞,包裝到這個類中,他可以很方便的監控事件的執行過程。
// 一、RACCommand使用步驟:
// 1.創建命令 initWithSignalBlock:(RACSignal * (^)(id input))signalBlock
// 2.在signalBlock中,創建RACSignal,并且作為signalBlock的返回值
// 3.執行命令 - (RACSignal *)execute:(id)input
// 二、RACCommand使用注意:
// 1.signalBlock必須要返回一個信號,不能傳nil.
// 2.如果不想要傳遞信號,直接創建空的信號[RACSignal empty];
// 3.RACCommand中信號如果數據傳遞完,必須調用[subscriber sendCompleted],這時命令才會執行完畢,否則永遠處于執行中。
// 4.RACCommand需要被強引用,否則接收不到RACCommand中的信號,因此RACCommand中的信號是延遲發送的。
// 三、RACCommand設計思想:內部signalBlock為什么要返回一個信號,這個信號有什么用。
// 1.在RAC開發中,通常會把網絡請求封裝到RACCommand,直接執行某個RACCommand就能發送請求。
// 2.當RACCommand內部請求到數據的時候,需要把請求的數據傳遞給外界,這時候就需要通過signalBlock返回的信號傳遞了。
// 四、如何拿到RACCommand中返回信號發出的數據。
// 1.RACCommand有個執行信號源executionSignals,這個是signal of signals(信號的信號),意思是信號發出的數據是信號,不是普通的類型。
// 2.訂閱executionSignals就能拿到RACCommand中返回的信號,然后訂閱signalBlock返回的信號,就能獲取發出的值。
// 五、監聽當前命令是否正在執行executing
// 六、使用場景,監聽按鈕點擊,網絡請求
// 1.創建命令
RACCommand *command = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) {
NSLog(@"執行命令");
// 創建空信號,必須返回信號
// return [RACSignal empty];
// 2.創建信號,用來傳遞數據
return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
[subscriber sendNext:@"請求數據"];
// 注意:數據傳遞完,最好調用sendCompleted,這時命令才執行完畢。
[subscriber sendCompleted];
return nil;
}];
}];
// 強引用命令,不要被銷毀,否則接收不到數據
_conmmand = command;
// 3.訂閱RACCommand中的信號
[command.executionSignals subscribeNext:^(id x) {
[x subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
}];
// RAC高級用法
// switchToLatest:用于signal of signals,獲取signal of signals發出的最新信號,也就是可以直接拿到RACCommand中的信號
[command.executionSignals.switchToLatest subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
// 4.監聽命令是否執行完畢,默認會來一次,可以直接跳過,skip表示跳過第一次信號。
[[command.executing skip:1] subscribeNext:^(id x) {
if ([x boolValue] == YES) {
// 正在執行
NSLog(@"正在執行");
}else{
// 執行完成
NSLog(@"執行完成");
}
}]; // 5.執行命令
[self.conmmand execute:@1];
簡單應用代碼如下
場景講解:列表頁面,含有上拉刷新和下拉加載
(項目中我是用的MVVM模式,不懂的朋友,可以看我原來寫的文章,RACCommand寫在viewModel類里面)
(.m中含有RACSubscriber,提前講解一下。表示訂閱者的意思,用于發送信號,這是一個協議,不是一個類,只要遵守這個協議,并且實現方法才能成為訂閱者。通過create創建的信號,都有一個訂閱者,幫助他發送數據。)
小結
今天講解了RAC基本幾大類的用法,慢慢體會,你會發現挺有意思的,學知識要循序漸進,今天就先寫這么多吧。很快將會有下一階段的講解,從簡到繁,喜歡的朋友歡迎關注,謝謝支持。