加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ReactiveCocoa

发布时间:2020-12-15 05:18:31 所属栏目:百科 来源:网络整理
导读:ReactiveCocoa @(iOS学习笔记)[翻译] 其他资料: 希望你优先查看其他资料 1. 简介:ReactiveCocoa in NSHipster 2. 概念1: ReactiveCocoa与Functional Reactive Programming 3. 概念2:说说ReactiveCocoa 2 4. 实战:ReactiveCocoa2实战 不得不说,这一篇非

ReactiveCocoa

@(iOS学习笔记)[翻译]

其他资料:希望你优先查看其他资料
1. 简介:ReactiveCocoa in NSHipster
2. 概念1: ReactiveCocoa与Functional Reactive Programming
3. 概念2:说说ReactiveCocoa 2
4. 实战:ReactiveCocoa2实战不得不说,这一篇非常有用,但是也必须是在看过了前三篇的情况下。
5. 强化:ReactiveCocoaBasic Operators基本操作
6. 南峰子: Reactive Cocoa

目录

  • ReactiveCocoa
    • kvo代替
    • 带条件的kvo
    • RAC条件控制
    • button的点击事件
    • 异步网络请求
    • 信号的多个异步事件监控
    • 多个异步信号顺序执行
    • RAC绑定异步执行结果

kvo代替


// 当self.username改变,都会输出一遍。 
[RACObserve(self,username) subscribeNext:^(NSString *newName) {
NSLog(@"%@",newName);
}];

带条件的kvo


// 当self.username改变,如果名字是以j开头的,则输出名字,否则不输出。 
[[RACObserve(self,username) filter:^(NSString *newName) {
return [newName hasPrefix:@"j"];}] subscribeNext:^(NSString *newName) {
NSLog(@"%@",newName);
}];

RAC条件控制


// 方法+combineLatest:reduce: 可以接收一个数组的信号,在这里creatEnabled 的真假是由self.password和self.passwordConfirmation是否一样来控制的。
RAC(self,createEnabled)=[RACSignal combineLatest:@[RACObserve(self,password),RACObserve(self,passwordConfirmation)] reduce:^(NSString *password,NSString *passwordConfirm) {
return @([passwordConfirm isEqualToString:password]);}];

button的点击事件


// 可以监控button的点击事件。 
self.button.rac_command = [[RACCommand alloc] initWithSignalBlock:^(id_){
NSLog(@"button was pressed!");
return [RACSignal empty];
}];

异步网络请求


// 可以自定一个事件(RACCommand),例如self.loginCommand,然后将事件调用的代码写在block里面。
self.loginCommand = [[RACCommand alloc] initWithSignalBlock:^(id sender)
{
// 当登陆请求完成后logIn方法返回一个信号。
return [client logIn];
}]; 
// 给登陆好以后加事件
[self.loginCommand.executionSignals subscribeNext:^(RACSignal*loginSignal){
// 登陆好以后输出成功
[loginSignal subscribeCompleted:^{
NSLog(@"Logged in successfully!");
}];
}];

// 将button的点击事件设置为自定义的事件
self.loginButton.rac_command = self.loginCommand;

signals 可以代表timers、大部分的UI事件、或者其他的总是在变的东西

信号的多个异步事件监控


// 当[client fetchUserRepos],[client fetchOrgRepos]均返回信号才会执行log
[[RACSignal merge:@[[client fetchUserRepos],[client fetchOrgRepos]]] subscribeCompleted:^{ NSLog(@"They're both done!");
}];

多个异步信号顺序执行


// 登陆后然后缓存用户信息
// loginUser是登陆代码,会返回用户信息类User
// -flattenMap: 在前面的方法发送一个signal值的时候会执行后面block中的代码
// 然后会将block中返回的signal合并成一个新的单独的RACSignal
[[[[client logInUser] flattenMap:^(User *user){
// 缓存User
return [client loadCachedMessagesForUser:user];
}] flattenMap:^(NSArray *messages){
return [client fetchMessagesAfterMessage:messages.lastObject];
}] subscribeNext:^(NSArray *newMessages){
NSLog(@"New messages: %@",newMessages);
} completed:^{
NSLog(@"Fetched all messages.");
}];

RAC绑定异步执行结果


// 创建一个单项绑定,这样就可以在用户登录的第一时间设置用户的头像到self.imageView.image,fetchUserWithUsername方法返回一个用户的signal。deliverOn方法创建一个新的signal到其他的线程工作。map将会在每一次fetchUserWithUsername返回信息的时候执行一遍block。
RAC(self.imageView,image) = [[[[client fetchUserWithUsername:@"joshaber"] deliverOn:[RACScheduler scheduler]] map:^(User *user) {
// 下载头像图片(这个时候是在其他线程中执行的)
return [[NSImage alloc] initWithContentsOfURL:user.avatarURL];
}]
// 现在,RAC将在主线程中执行
deliverOn:RACScheduler.mainThreadScheduler];

上面的例子只能展示出这个东西到底能干什么,但是不能表明出它的强大支出。
如果需要更多的示例代码,请查看C-41这个项目。
更多RAC的文档

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读