美文网首页
ReactiveCocoa笔记2

ReactiveCocoa笔记2

作者: wata | 来源:发表于2018-02-11 00:07 被阅读4次
    1. then:等待当前信号complete之后再连接下一个信号,并且会把error也传出来,这样在后面subscribeNext:error:的时候也能接收到当前信号发出的error
    [[[self requestAccessToTwitterSignal]
      then:^RACSignal *{
        @strongify(self)
        return self.searchText.rac_textSignal;
      }]
      subscribeNext:^(id x) {
        NSLog(@"%@", x);
      } error:^(NSError *error) {
        NSLog(@"An error occurred: %@", error);
      }];
    
    1. filter:可以过滤信号,当不满足条件的时候不需要触发接收者,可以用filter:过滤,返回YES则继续传递,返回NO则终止传递:
    [[[[self requestAccessToTwitterSignal]
      then:^RACSignal *{
        @strongify(self)
        return self.searchText.rac_textSignal;
      }]
      filter:^BOOL(NSString *text) {
        @strongify(self)
        return [self isValidSearchText:text];
      }]
      subscribeNext:^(id x) {
        NSLog(@"%@", x);
      } error:^(NSError *error) {
        NSLog(@"An error occurred: %@", error);
      }];
    
    1. 用deliverOn:来切换当前流所在的线程,例如http请求完处理理数据更新UI的时候,需要切换到主线程中执行
    [[[[[[self requestAccessToTwitterSignal]
     then:^RACSignal *{
       @strongify(self)
       return self.searchText.rac_textSignal;
     }]
     filter:^BOOL(NSString *text) {
       @strongify(self)
       return [self isValidSearchText:text];
     }]
     flattenMap:^RACStream *(NSString *text) {
       @strongify(self)
       return [self signalForSearchWithText:text];
     }]
     deliverOn:[RACScheduler mainThreadScheduler]]
     subscribeNext:^(id x) {
       NSLog(@"%@", x);
     } error:^(NSError *error) {
       NSLog(@"An error occurred: %@", error);
     }];
    
    1. subscribeOn:可以保证信号在指定的线程执行,比如下载图片时需要在后台线程(下载完展示的时候需要在主线程执行)
    -(RACSignal *)signalForLoadingImage:(NSString *)imageUrl {
      
      RACScheduler *scheduler = [RACScheduler
                             schedulerWithPriority:RACSchedulerPriorityBackground];
      
      return [[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:imageUrl]];
        UIImage *image = [UIImage imageWithData:data];
        [subscriber sendNext:image];
        [subscriber sendCompleted];
        return nil;
      }] subscribeOn:scheduler];
    }
    
    //----------------------
    cell.twitterAvatarView.image = nil;
    [[[self signalForLoadingImage:tweet.profileImageUrl]
      deliverOn:[RACScheduler mainThreadScheduler]]
      subscribeNext:^(UIImage *image) {
       cell.twitterAvatarView.image = image;
      }];
    
    1. throttle:方法可以丢弃掉指定时间内两个next事件中的前一个next事件.好像我们使用自动搜索功能的时候,如果一直在输入新的字符串,搜索结果是不会改变的,只有我们比较长时间没有输入的时候,搜索请求才会触发, 搜索数据才会更新,如下:
    [[[[[[[self requestAccessToTwitterSignal]
      then:^RACSignal *{
        @strongify(self)
        return self.searchText.rac_textSignal;
      }]
      filter:^BOOL(NSString *text) {
        @strongify(self)
        return [self isValidSearchText:text];
      }]
      throttle:0.5]
      flattenMap:^RACStream *(NSString *text) {
        @strongify(self)
        return [self signalForSearchWithText:text];
      }]
      deliverOn:[RACScheduler mainThreadScheduler]]
      subscribeNext:^(NSDictionary *jsonSearchResult) {
        NSArray *statuses = jsonSearchResult[@"statuses"];
        NSArray *tweets = [statuses linq_select:^id(id tweet) {
          return [RWTweet tweetWithStatus:tweet];
        }];
        [self.resultsViewController displayTweets:tweets];
      } error:^(NSError *error) {
        NSLog(@"An error occurred: %@", error);
      }]; 
    

    1. distinctUntilChanged方法,会过滤掉跟上次snedNext:值一样的信号.如果一次sendNext是0,下一次还是sendNext:0就会过滤掉.只有sendNext:的值跟上次不一样的时候才会通过.例如
    RACSignal *validSearchSignal =
        [[RACObserve(self, searchText)
          map:^id(NSString *text) {
             return @(text.length > 3);
          }]
          distinctUntilChanged];
    

    相关文章

      网友评论

          本文标题:ReactiveCocoa笔记2

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