ReactiveCocoa

ReactiveCocoa

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

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

目录

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的文档

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值