- (void)map {
// Map使用步驟:
// 1.傳入一個block,類型是返回對象,參數(shù)是value
// 2.value就是源信號的內(nèi)容,直接拿到源信號的內(nèi)容做處理
// 3.把處理好的內(nèi)容,直接返回就好了,不用包裝成信號,返回的值,就是映射的值。
// Map底層實現(xiàn):
// 0.Map底層其實是調(diào)用flatternMap,Map中block中的返回的值會作為flatternMap中block中的值。
// 1.當(dāng)訂閱綁定信號,就會生成bindBlock。
// 3.當(dāng)源信號發(fā)送內(nèi)容,就會調(diào)用bindBlock(value, *stop)
// 4.調(diào)用bindBlock,內(nèi)部就會調(diào)用flattenMap的block
// 5.flattenMap的block內(nèi)部會調(diào)用Map中的block,把Map中的block返回的內(nèi)容包裝成返回的信號。
// 5.返回的信號最終會作為bindBlock中的返回信號,當(dāng)做bindBlock的返回信號。
// 6.訂閱bindBlock的返回信號,就會拿到綁定信號的訂閱者,把處理完成的信號內(nèi)容發(fā)送出來。
// Map作用:把源信號的值映射成一個新的值
// 創(chuàng)建信號
RACSubject *subject = [RACSubject subject];
// 綁定信號
RACSignal *bindSignal = [subject map:^id(id value) {
// 返回的類型就是你需要映射的值
return [NSString stringWithFormat:@"ws:%@", value]; //這里將源信號發(fā)送的“123” 前面拼接了ws:
}];
// 訂閱綁定信號
[bindSignal subscribeNext:^(id x) {
NSLog(@"%@", x);
}];
// 發(fā)送信號
[subject sendNext:@"123"];
}
/*
FlatternMap和Map的區(qū)別
1.FlatternMap中的Block返回信號。
2.Map中的Block返回對象。
3.開發(fā)中,如果信號發(fā)出的值不是信號,映射一般使用Map
4.開發(fā)中,如果信號發(fā)出的值是信號,映射一般使用FlatternMap。
*/
- (void)flatMap {
// 創(chuàng)建信號
RACSubject *subject = [RACSubject subject];
// 綁定信號
RACSignal *bindSignal = [subject flattenMap:^RACStream *(id value) {
// block:只要源信號發(fā)送內(nèi)容就會調(diào)用
// value: 就是源信號發(fā)送的內(nèi)容
// 返回信號用來包裝成修改內(nèi)容的值
return [RACReturnSignal return:value];
}];
// flattenMap中返回的是什么信號,訂閱的就是什么信號(那么,x的值等于value的值,如果我們操縱value的值那么x也會隨之而變)
// 訂閱信號
[bindSignal subscribeNext:^(id x) {
NSLog(@"%@", x);
}];
// 發(fā)送數(shù)據(jù)
[subject sendNext:@"123"];
}
- (void)flattenMap2 {
// flattenMap 主要用于信號中的信號
//signalOfsignals用FlatternMap
// 創(chuàng)建信號
RACSubject *signalofSignals = [RACSubject subject];
RACSubject *signal = [RACSubject subject];
// 訂閱信號
//方式1
// [signalofSignals subscribeNext:^(id x) {
//
// [x subscribeNext:^(id x) {
// NSLog(@"%@", x);
// }];
// }];
// 方式2
// [signalofSignals.switchToLatest ];
// 方式3
// RACSignal *bignSignal = [signalofSignals flattenMap:^RACStream *(id value) {
//
// //value:就是源信號發(fā)送內(nèi)容
// return value;
// }];
// [bignSignal subscribeNext:^(id x) {
// NSLog(@"%@", x);
// }];
// 方式4--------也是開發(fā)中常用的
[[signalofSignals flattenMap:^RACStream *(id value) {
return value;
}] subscribeNext:^(id x) {
NSLog(@"%@", x);
}];
// 發(fā)送信號
[signalofSignals sendNext:signal];
[signal sendNext:@"123"];
}
注:轉(zhuǎn)載自http://blog.csdn.net/y_csdnblog_xx/article/details/51480508