美文网首页tomRAC集合
RAC之RACSignal,RACSubject, RACSeq

RAC之RACSignal,RACSubject, RACSeq

作者: jiangamh | 来源:发表于2016-03-06 09:52 被阅读2580次

学习RAC先从熟悉简单类的使用开始,RACSignal信号类,使用方法:
(1)createSignal创建信号类
(2)订阅信号,subscribeNext,如果没有订阅信号,为冷信号,订阅后才能成为热信号
(3)sendnext 发送信号
工作流程:
(1)创建信号,保存了createSignal参数block,命名为block1
(2)订阅信号,调用subscribeNext,内部创建了订阅者,并调用block1,并保存了subscribeNext参数block,命名为block2,
(3)发送信号,sendNext,本质上是调用的订阅者的block,即block2

-(void)racSignalTest
{
    RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        
        [subscriber sendNext:@1];
        [subscriber sendCompleted];
        return [RACDisposable disposableWithBlock:^{
            NSLog(@"信号被摧毁");
        }];
    }];
    
    [signal subscribeNext:^(id x) {
        NSLog(@"%@,type;%@",x,NSStringFromClass(object_getClass(x)));
    }];
    [signal subscribeNext:^(id x) {
        NSLog(@"%@,type;%@",x,NSStringFromClass(object_getClass(x)));

    }];
    
}

RACSubject:信号提供者,自己可以充当信号,又能发送信号。
创建方法:
(1)创建RACSubject
(2)订阅信号
(3)发送信号
工作流程:
(1)订阅信号时,内部保存了订阅者,和订阅者响应block
(2)当发送信号的,遍历订阅者,调用订阅者的nextBlock
注:如果订阅信号,必须在发送信号之前订阅信号,不然收不到信号,这也有别于RACReplaySubject

-(void)racSubjectTest
{
    RACSubject *subject = [RACSubject subject];
    [subject subscribeNext:^(id x) {
        NSLog(@"1 %@,type:%@",x,NSStringFromClass(object_getClass(x)));
    }];
    [subject subscribeNext:^(id x) {
        NSLog(@"2 %@,type:%@",x,NSStringFromClass(object_getClass(x)));
    }];
    
    [subject sendNext:@1];
    [subject subscribeNext:^(id x) {
       NSLog(@"3 %@,type:%@",x,NSStringFromClass(object_getClass(x)));
    }];
}

RACSubject替代代理

第一个控制器,点击按钮进入第二个控制器
- (IBAction)butClicked:(id)sender {
    CustumViewController *towVc = [[CustumViewController alloc] init];
    towVc.subjec = [RACSubject subject];
    [towVc.subjec subscribeNext:^(id x) {
        NSLog(@"被通知了:%@",x);
    }];
    [self.navigationController pushViewController:towVc animated:YES];
}
第二个控制器,点击按钮通知第一个控制器
- (IBAction)btnClicked:(id)sender {
    if (self.subjec) {
        [self.subjec sendNext:@1];
    }
}

RACReplaySubject 创建方法:
(1)创建RACSubject
(2)订阅信号
(3)发送信号
工作流程:
(1)订阅信号时,内部保存了订阅者,和订阅者响应block
(2)当发送信号的,遍历订阅者,调用订阅者的nextBlock
(3)发送的信号会保存起来,当订阅者订阅信号的时,会将之前保存的信号,一个一个作用于新的订阅者,保存信号的容量由capacity决定,这也是有别有RACSubject的

-(void)RACReplaySubject
{
    RACReplaySubject *replaySubject = [RACReplaySubject subject];
    [replaySubject subscribeNext:^(id x) {
        NSLog(@"1 %@,type:%@",x,NSStringFromClass(object_getClass(x)));
    }];
    [replaySubject subscribeNext:^(id x) {
        NSLog(@"1 %@,type:%@",x,NSStringFromClass(object_getClass(x)));
    }];
    [replaySubject sendNext:@1];
    
    [replaySubject subscribeNext:^(id x) {
        NSLog(@"3 %@,type:%@",x,NSStringFromClass(object_getClass(x)));
    }];
}

RACSequence

-(void)RACSequenceTest
{
    NSArray *arr = @[@1,@2,@3,@4,@5,@6];
    [arr.rac_sequence.signal subscribeNext:^(id x) {
       
        NSLog(@"x:%@",x);
    }];
    
    NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:@"jtd",@"name",@"man",@"sex",@"jx",@"jg", nil];
    [dict.rac_sequence.signal subscribeNext:^(id x) {
        RACTupleUnpack(NSString *key,NSString *value) = x;
        
        NSLog(@"key:%@,value:%@",key,value);
    }];
    
    NSDictionary *dict1 = @{@"key1":@"value1",@"key2":@"value2"};
    NSDictionary *dict2 = @{@"key1":@"value1",@"key2":@"value2"};
    NSArray *dictArr = @[dict1,dict2];
    [dictArr.rac_sequence.signal subscribeNext:^(id x) {
        NSLog(@"x:%@,type:%@",x,NSStringFromClass(object_getClass(x)));
    }];
}

RAC正在学习路上......

相关文章

网友评论

    本文标题:RAC之RACSignal,RACSubject, RACSeq

    本文链接:https://www.haomeiwen.com/subject/xglakttx.html