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

增加搜索好友功能 由于 XMPP 不能直接查询到数据库中已注册的用户,这里使用HTTP请求来查询好友,由于没有接口,就用豆瓣音乐的搜索音乐的API模拟吧。
1.首先快速搭建一个响应是的所搜框


[[self.search.rac_textSignal
doNext:^(NSString *x) {
@strongify(self)
if (x.length>2) {
self.search.backgroundColor=[UIColor whiteColor];
}else{
self.search.backgroundColor = [UIColor yellowColor];
}
}]

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

  • (RACSignal *)signalForSearchWithText:(NSString *)text {
    return [RACSignal createSignal:^RACDisposable *(id 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;
    }];

}


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


[[[[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);
}];

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


/**

  • 异步加载图片使用 [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];
    }

在cell内执行 , 刷新UI时注意线程

[[[[self signalForImage:music.image]
takeUntil:cell.rac_prepareForReuseSignal]
deliverOn:[RACScheduler mainThreadScheduler]]
subscribeNext:^(UIImage *x) {
cell.imageView.image = x;
}];

不过用SDWebImage也可以 思路一样 SDWebImage 更全面一些 同样最后吧查询方法封装在XMPPTool里方便管理

运行:

ReactiveCocoa 结合 XMPP 学习笔记 第四部分_第1张图片
Simulator Screen Shot 2016年4月22日 下午4.38.49.png

界面丑爆了见谅 完整 Dome

你可能感兴趣的:(ReactiveCocoa 结合 XMPP 学习笔记 第四部分)