一,RACSignal
//1,創(chuàng)建一個(gè)冷信號径玖,這個(gè)時(shí)候會把代碼存儲到block中辕羽,當(dāng)?shù)诙接嗛喰盘柕臅r(shí)候會調(diào)用block內(nèi)容(如果需要傳遞數(shù)據(jù)過去,用subscriber進(jìn)行即可,如下)
RACSignal *signal = [RACSignal createSignal:^RACDisposable *(idsubscriber) {
NSLog(@"ok, excute me");
[subscriber sendNext:@"I am the subscriber sending message"];
return nil;
}];
//2,訂閱信號气筋,使冷信號變熱信號,這個(gè)時(shí)候會調(diào)用之前保存的代碼并執(zhí)行block
[signal subscribeNext:^(id x) {
NSLog(@"I got a message from subscriber");
//x是信號中傳遞過來的信息
NSLog(@"%@",x);
}];
二旋圆,RACDisposal
1,RACDisposal會自動取消訂閱
//RACDisposal(用于取消訂閱或者清理資源宠默,當(dāng)信號發(fā)送完成或者發(fā)送錯(cuò)誤的時(shí)候就會自動觸發(fā))
RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
//這里需要注意一下,RACSubscriber是一個(gè)協(xié)議灵巧,只要遵守協(xié)議就可以成為訂閱者
NSLog(@"ok,這里是暫時(shí)保存的block");
[subscriber sendNext:@"發(fā)送數(shù)據(jù)"];
return [RACDisposable disposableWithBlock:^{
NSLog(@"在這里自動取消訂閱搀矫,清空資源等等");
//如果不想在這個(gè)時(shí)候取消而是需要在特定時(shí)刻手動取消訂閱,需要強(qiáng)引用subscriber這個(gè)對象
}];
}];
[signal subscribeNext:^(id x) {
//訂閱之后就可以接收數(shù)據(jù)了
NSLog(@"%@",x);
}];
2,RACDisposal手動取消訂閱
//1,創(chuàng)建信號并強(qiáng)引用subscriber
RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
//這里需要注意一下刻肄,RACSubscriber是一個(gè)協(xié)議瓤球,只要遵守協(xié)議就可以成為訂閱者
self.subscriber = subscriber;
NSLog(@"ok,這里是暫時(shí)保存的block");
[subscriber sendNext:@"發(fā)送數(shù)據(jù)"];
return [RACDisposable disposableWithBlock:^{
NSLog(@"手動取消訂閱,會來到這里敏弃,清空資源等等");
}];
}];
//2卦羡,取出訂閱方法返回值
RACDisposable *disposable = [signal subscribeNext:^(id x) {
//訂閱之后就可以接收數(shù)據(jù)了
NSLog(@"%@",x);
}];
//3,用訂閱返回值手動取消訂閱
[disposable dispose];
三,RACSubject
/*
RACSubject之所以發(fā)送數(shù)據(jù)麦到,是因?yàn)樗袷亓?lt;RACSubscriber>绿饵,作為一個(gè)遵守了<RACSubscriber>協(xié)議的RACSignal的子類,所以說它既可以創(chuàng)建信號瓶颠,自身又可以發(fā)送數(shù)據(jù)
*/
//1,創(chuàng)建信號
RACSubject *subject = [RACSubject subject];
//2拟赊,訂閱信號
[subject subscribeNext:^(id x) {
NSLog(@"訂閱者01接收到數(shù)據(jù)------%@",x);
}];
[subject subscribeNext:^(id x) {
NSLog(@"訂閱者02接收到數(shù)據(jù)------%@",x);
}];
//3, 發(fā)送信號數(shù)據(jù)
[subject sendNext:@"ok, message send"];
四,RACReplaySubject
-
RACReplaySubject和RACSubject的不同之處在于:/*
1,RACReplaySubject在發(fā)送信號數(shù)據(jù)的時(shí)候只是保存block粹淋,并沒有遍歷自身的訂閱著執(zhí)行block吸祟,而RACSubject在發(fā)送數(shù)據(jù)的時(shí)候就已經(jīng)遍歷了自身訂閱者執(zhí)行block
2,因此桃移,RACSubject必須要在發(fā)送數(shù)據(jù)的之前創(chuàng)建訂閱者欢搜,也就是需要在發(fā)送數(shù)據(jù)之前訂閱信號(訂閱信號的時(shí)候創(chuàng)建訂閱者),而RACReplaySubject則可以先發(fā)送數(shù)據(jù)谴轮,之后再訂閱信號炒瘟,因?yàn)樗诎l(fā)送數(shù)據(jù)的時(shí)候只是保存block,真正調(diào)用時(shí)在訂閱者創(chuàng)建之后才會重新激活調(diào)用發(fā)送數(shù)據(jù)的block
*/
//1,創(chuàng)建信號
RACReplaySubject *replaySubject = [RACReplaySubject subject];
//4,也可以先發(fā)送數(shù)據(jù)
[replaySubject sendNext:@"先發(fā)送數(shù)據(jù)第步,后訂閱也可以"];
//2疮装,訂閱信號
[replaySubject subscribeNext:^(id x) {
NSLog(@"訂閱者01接受到數(shù)據(jù)----%@",x);
}];
[replaySubject subscribeNext:^(id x) {
NSLog(@"訂閱者02接受到數(shù)據(jù)----%@",x);
}];
//3, 發(fā)送信號數(shù)據(jù)
[replaySubject sendNext:@"ok, message send"];