增加搜索好友功能 由于 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里方便管理
运行:
界面丑爆了见谅 完整Dome