ReactiveCocoa笔记2

  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];
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,301评论 19 139
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,425评论 11 349
  • RAC使用测试Demo下载:github.com/FuWees/WPRACTestDemo 1.ReactiveC...
    FuWees阅读 11,536评论 3 10
  • 来自第三宫,游戏人间,天使和魔鬼同住一体。 如风一般善变灵通,巧言善语,行文妙笔,掠千万树上叶,倾万千丛中...
    文沭阅读 1,514评论 0 0
  • 最近都累的跟狗似的。 这几天都是上A班,人很少,很忙,我从早上七点起床,七点半去吃早餐,八点上班直...
    X静馨阅读 949评论 2 1