對(duì)信號(hào)的一些執(zhí)行操作
send信號(hào)前執(zhí)行相應(yīng)的block
//doNext doComplete doError中的block會(huì)分別在對(duì)應(yīng)的sendNext sendComplete sendError之前執(zhí)行
[[[[self.testSignal doNext:^(id x) {
NSLog(@"sendNext之前會(huì)執(zhí)行這個(gè)block");
}] doCompleted:^{
NSLog(@"sendComplete之前會(huì)執(zhí)行這個(gè)block");
}] doError:^(NSError *error) {
NSLog(@"sendError之前會(huì)執(zhí)行這個(gè)block");
}] subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
超時(shí)自動(dòng)報(bào)錯(cuò)
[[self.testSignal timeout:1 onScheduler:[RACScheduler mainThreadScheduler]] subscribeNext:^(id x) {
NSLog(@"%@",x);
} error:^(NSError *error) {
//超時(shí)一秒后會(huì)自動(dòng)報(bào)錯(cuò)
NSLog(@"%@",error);
}];
定時(shí)執(zhí)行
和前面講的定時(shí)器類似
//每一秒執(zhí)行一次,這里要加上釋放信號(hào),否則控制器推出后依舊會(huì)執(zhí)行,看具體需求吧
[[[RACSignal interval:1 onScheduler:[RACScheduler scheduler]]takeUntil:self.rac_willDeallocSignal ] subscribeNext:^(id x) {
NSLog(@"%@",[NSDate date]);
}];
延時(shí)執(zhí)行
[[self.testSignal delay:2] subscribeNext:^(id x) {
NSLog(@"%@",[NSDate date]);
}];
信號(hào)發(fā)送失敗后會(huì)重新執(zhí)行
[[self.testSignal retry] subscribeNext:^(id x) {
NSLog(@"%@",x);
} error:^(NSError *error) {
NSLog(@"%@",error);
}];
當(dāng)一個(gè)信號(hào)被多次訂閱后會(huì)像熱信號(hào)那樣
當(dāng)一個(gè)信號(hào)被多次訂閱時(shí),不會(huì)每次都執(zhí)行一遍副作用,而是像熱信號(hào)一樣只執(zhí)行一遍,replay內(nèi)部將信號(hào)封裝RACMulticastConnection的熱信號(hào)
拿示例來說第一個(gè)例子我們不對(duì)信號(hào)進(jìn)行replay操作
RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
static int a = 1;
[subscriber sendNext:@(a)];
a ++;
return nil;
}];
[signal subscribeNext:^(id x) {
NSLog(@"第一個(gè)訂閱者%@",x);
}];
[signal subscribeNext:^(id x) {
NSLog(@"第二個(gè)訂閱者%@",x);
}];
-
輸出結(jié)果如下
2016-09-02 11:57:50.312 Signal processing[3703:323215] 第一個(gè)訂閱者1 2016-09-02 11:57:50.312 Signal processing[3703:323215] 第二個(gè)訂閱者2
這個(gè)結(jié)果說明了冷信號(hào)的本質(zhì)以及副作用,每訂閱一次冷信號(hào),都會(huì)完整的執(zhí)行一次副作用
下來對(duì)冷信號(hào)進(jìn)行replay操作
RACSignal *signal = [[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
static int a = 1;
[subscriber sendNext:@(a)];
a ++;
return nil;
}] replay];
[signal subscribeNext:^(id x) {
NSLog(@"第一個(gè)訂閱者%@",x);
}];
[signal subscribeNext:^(id x) {
NSLog(@"第二個(gè)訂閱者%@",x);
}];
-
輸出結(jié)果如下
2016-09-02 11:59:44.352 Signal processing[3782:328331] 第一個(gè)訂閱者1 2016-09-02 11:59:44.352 Signal processing[3782:328331] 第二個(gè)訂閱者1
由此可以看出,實(shí)際上是將冷信號(hào)只發(fā)送了一次
節(jié)流
對(duì)信號(hào)使用throttle這個(gè)方法,原理就是類似若一段時(shí)間后沒有新信號(hào)就執(zhí)行最后這個(gè)信號(hào),前面講的即時(shí)搜索的優(yōu)化就是一個(gè)很好的例子,主要用在降低服務(wù)器壓力以及其他一些信號(hào)發(fā)送頻繁,但訂閱卻不需要如此頻繁的地方.
[[signal throttle:1] subscribeNext:^(id x) {
NSLog(@"%@",x);
}];