1遮糖、信號創(chuàng)建
2冕广、信號訂閱
3、單個信號的變換
3.1 值操作
3.2 數(shù)量操作
3.3 時間操作
4 多個信號操作
4盈滴、信號的高階操作
5涯肩、冷信號和熱信號
6、RAC并發(fā)編程
7巢钓、RACChannel 雙向綁定
RACChannelTo(view, property) = RACChannelTo(model, property);
等價于
[[RACKVOChannel alloc] initWithTarget:view keyPath:@"property" nilValue:nil][@"followingTerminal"] = [[RACKVOChannel alloc] initWithTarget:model keyPath:@"property" nilValue:nil][@"followingTerminal"];
[[RACKVOChannel alloc] initWithTarget:[NSUserDefaults standardUserDefaults]
keyPath:@"someBoolKey" nilValue:@(NO)][@"followingTerminal"] = [[RACKVOChannel alloc] initWithTarget:self.someSwitch keyPath:@"on" nilValue:@(NO)][@"followingTerminal"];
// 上面的不能完全實現(xiàn)雙向綁定病苗,因為 UISwitch 的 on 屬性是不支持 KVO 的
@weakify(self)
[self.someSwitch.rac_newOnChannel subscribeNext:^(NSNumber *onValue) {
@strongify(self)
// 下面兩句都可以
[self.someSwitch setValue:onValue forKey:@"on"];
//[[NSUserDefaults standardUserDefaults] setObject:onValue forKey:@"someBoolKey"];
}];
8、其它
-
1症汹、RACSignal
-
2硫朦、RACSubject
RACSubject,必須先訂閱者背镇,再發(fā)送信號咬展,這時訂閱者才能收到信號
-
3、RACReplaySubject
RACReplaySubject : 可以先發(fā)送信號瞒斩,再有訂閱者挚赊,
-
4、RAC集合類
- 5济瓢、代替代理:直接監(jiān)聽SEL
- 6荠割、代替KVO
-
7、代替點擊事件
-
8旺矾、代替通知
-
9蔑鹦、監(jiān)聽文本框輸入
-
10、定時器
-
11箕宙、信號同步
-
12嚎朽、RACMulticastConnection
RACMulticastConnection:當(dāng)有多個訂閱時,只需要發(fā)送一次信號
RACSignal : 當(dāng)有多個訂閱者的時候柬帕,信號會多次發(fā)送哟忍。
-
13狡门、RACCommand
-
14、bind
15锅很、then
信號A 和信號B其馏,當(dāng)A信號發(fā)送完畢后,才輪到信號B爆安,A的數(shù)據(jù)并沒有被訂閱處理叛复,只會訂閱處理B數(shù)據(jù)
16、信號過濾
// 跳躍 : 如下扔仓,skip傳入2 跳過前面兩個值
// 實際用處: 在實際開發(fā)中比如 后臺返回的數(shù)據(jù)前面幾個沒用褐奥,我們想跳躍過去,便可以用skip
- (void)skip {
RACSubject *subject = [RACSubject subject];
[[subject skip:2] subscribeNext:^(id x) {
NSLog(@"%@", x);
}];
[subject sendNext:@1];
[subject sendNext:@2];
[subject sendNext:@3];
}
//distinctUntilChanged:-- 如果當(dāng)前的值跟上一次的值一樣翘簇,就不會被訂閱到
- (void)distinctUntilChanged {
RACSubject *subject = [RACSubject subject];
[[subject distinctUntilChanged] subscribeNext:^(id x) {
NSLog(@"%@", x);
}];
// 發(fā)送信號
[subject sendNext:@1];
[subject sendNext:@2];
[subject sendNext:@2]; // 不會被訂閱
}
// take:可以屏蔽一些值,去前面幾個值---這里take為2 則只拿到前兩個值
- (void)take {
RACSubject *subject = [RACSubject subject];
[[subject take:2] subscribeNext:^(id x) {
NSLog(@"%@", x);
}];
// 發(fā)送信號
[subject sendNext:@1];
[subject sendNext:@2];
[subject sendNext:@3];
}
//takeLast:和take的用法一樣撬码,不過他取的是最后的幾個值,如下版保,則取的是最后兩個值
//注意點:takeLast 一定要調(diào)用sendCompleted耍群,告訴他發(fā)送完成了,這樣才能取到最后的幾個值
- (void)takeLast {
RACSubject *subject = [RACSubject subject];
[[subject takeLast:2] subscribeNext:^(id x) {
NSLog(@"%@", x);
}];
// 發(fā)送信號
[subject sendNext:@1];
[subject sendNext:@2];
[subject sendNext:@3];
[subject sendCompleted];
}
// takeUntil:---給takeUntil傳的是哪個信號找筝,那么當(dāng)這個信號發(fā)送信號或sendCompleted蹈垢,就不能再接受源信號的內(nèi)容了。
- (void)takeUntil {
RACSubject *subject = [RACSubject subject];
RACSubject *subject2 = [RACSubject subject];
[[subject takeUntil:subject2] subscribeNext:^(id x) {
NSLog(@"%@", x);
}];
// 發(fā)送信號
[subject sendNext:@1];
[subject sendNext:@2];
[subject2 sendNext:@3]; // 1
// [subject2 sendCompleted]; // 或2
[subject sendNext:@4];
}
// ignore: 忽略掉一些值
- (void)ignore {
//ignore:忽略一些值
//ignoreValues:表示忽略所有的值
// 1.創(chuàng)建信號
RACSubject *subject = [RACSubject subject];
// 2.忽略一些值
RACSignal *ignoreSignal = [subject ignore:@2]; // ignoreValues:表示忽略所有的值
// 3.訂閱信號
[ignoreSignal subscribeNext:^(id x) {
NSLog(@"%@", x);
}];
// 4.發(fā)送數(shù)據(jù)
[subject sendNext:@2];
}
// 一般和文本框一起用袖裕,添加過濾條件
- (void)fliter {
// 只有當(dāng)文本框的內(nèi)容長度大于5曹抬,才獲取文本框里的內(nèi)容
[[self.textField.rac_textSignal filter:^BOOL(id value) {
// value 源信號的內(nèi)容
return [value length] > 5;
// 返回值 就是過濾條件。只有滿足這個條件才能獲取到內(nèi)容
}] subscribeNext:^(id x) {
NSLog(@"%@", x);
}];
}