美文网首页
ReactiveCocoa 结合 XMPP 学习笔记 第四部分

ReactiveCocoa 结合 XMPP 学习笔记 第四部分

作者: Gaooof | 来源:发表于2016-04-22 17:39 被阅读39次

    增加搜索好友功能 由于 XMPP 不能直接查询到数据库中已注册的用户,这里使用HTTP请求来查询好友,由于没有接口,就用豆瓣音乐的搜索音乐的API模拟吧。
    1.首先快速搭建一个响应是的所搜框
    <pre>
    [[self.search.rac_textSignal
    doNext:^(NSString *x) {
    @strongify(self)
    if (x.length>2) {
    self.search.backgroundColor=[UIColor whiteColor];
    }else{
    self.search.backgroundColor = [UIColor yellowColor];
    }
    }]
    </pre>

    2.创建一个信号将搜索的结果返回 使用AFNetworking 和MJExtension转模型
    <pre>

    • (RACSignal *)signalForSearchWithText:(NSString *)text {
      return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
      AFHTTPSessionManager *mgr = [AFHTTPSessionManager manager];
      NSMutableDictionary *parrameter = [NSMutableDictionary dictionary];
      parrameter[@"q"] = text;
      parrameter[@"count"] = @"10";
      [mgr GET:@"https://api.douban.com/v2/music/search" parameters:parrameter progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
      NSArray *musices = [Music mj_objectArrayWithKeyValuesArray:responseObject[@"musics"]];
      [subscriber sendNext:musices];
      [subscriber sendCompleted];
      } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
      [subscriber sendError:error];
      }];
      return nil;
      }];

    }
    </pre>
    3.接着search继续
    这里需要使用 flattenMap 做信号映射 并设置数据源

    <pre>
    [[[[self.search.rac_textSignal
    doNext:^(NSString *x) {
    @strongify(self)
    if (x.length>2) {
    self.search.backgroundColor=[UIColor whiteColor];
    }else{
    self.search.backgroundColor = [UIColor yellowColor];
    }
    }]
    throttle:1]
    flattenMap:^RACStream *(NSString *value) {
    NSLog(@"%@",value);
    @strongify(self)
    return [self signalForSearchWithText:value];
    }]
    subscribeNext:^(NSArray *x) {
    @strongify(self)
    self.musices = x;
    [self.tableView reloadData];
    } error:^(NSError *error) {
    NSLog(@"%@",error);
    }];
    </pre>

    注意到上面的 throttle:1 可以延迟一秒后在执行 访问频繁豆瓣会拒绝的......
    在基础教程中有一个异步加载图片的signal方法
    <pre>
    /**

    • 异步加载图片使用 [RACScheduler schedulerWithPriority:RACSchedulerPriorityBackground] 方法点开方法可以看到就是 GCD
      */
      -(RACSignal *)signalForImage:(NSString *)imageUrl {
      RACScheduler *scheduler = [RACScheduler schedulerWithPriority:RACSchedulerPriorityBackground];
      return [[RACSignal createSignal:^RACDisposable *(id subscriber) {
      NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:imageUrl]];
      UIImage *image = [UIImage imageWithData:data];
      [subscriber sendNext:image];
      [subscriber sendCompleted];
      return nil;
      }]
      subscribeOn:scheduler];
      }
      </pre>
      在cell内执行 , 刷新UI时注意线程
      <pre>
      [[[[self signalForImage:music.image]
      takeUntil:cell.rac_prepareForReuseSignal]
      deliverOn:[RACScheduler mainThreadScheduler]]
      subscribeNext:^(UIImage *x) {
      cell.imageView.image = x;
      }];
      </pre>
      不过用SDWebImage也可以 思路一样 SDWebImage 更全面一些 同样最后吧查询方法封装在XMPPTool里方便管理

    运行:

    Simulator Screen Shot 2016年4月22日 下午4.38.49.png
    界面丑爆了见谅 完整Dome

    相关文章

      网友评论

          本文标题:ReactiveCocoa 结合 XMPP 学习笔记 第四部分

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