ReactiveCocoa笔记2

2018-02-11  本文已影响4人  wata
  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];
上一篇下一篇

猜你喜欢

热点阅读