美文网首页
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

    then:等待当前信号complete之后再连接下一个信号,并且会把error也传出来,这样在后面subscrib...

  • ReactiveCocoa笔记2

    RACSubject 与 RACReplaySubject

  • ReactiveCocoa理解笔记(2)

    MVVM和ReactiveCocoa 在MVVM中UIViewController讲专注的负责View的管理、界面...

  • ReactiveCocoa优秀文章集合

    1、说说ReactiveCocoa 2 - CocoaChina 2、这样好用的ReactiveCocoa,根本停...

  • RAC

    本篇文章是用来记录一下有关 ReactiveCocoa 的学习笔记。 简介 ReactiveCocoa(简称 RA...

  • [个人博客搬运]ReactiveCocoa学习笔记

    ReactiveCocoa学习笔记 前言 ReactiveCocoa是一个很有意思的FRP框架,用法简单,但是理解...

  • ReactiveCocoa笔记

    RAC 参考文章 细说ReactiveCocoa的冷信号与热信号(一) 细说ReactiveCocoa的冷信号与热...

  • ReactiveCocoa笔记

    一:关于ReactiveCocoa的知识点 1:RACSigner基础知识点 常见的操作方法: 2:RACSubj...

  • reactivecocoa笔记

    RACSignal 值操作 map 值操作 mapReplace 值操作 reduceEach只能用在元祖上 值操...

  • ReactiveCocoa笔记

    ReactiveCocoa 打破了苹果 API 排他性的束缚,勇敢地开创了 Objective-C 的新纪元,具有...

网友评论

      本文标题:ReactiveCocoa笔记2

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