ReactiveCocoa
RAC简介:ReactiveCocoa是GitHub开源的一款cocoa FRP框架。它的开源地址为:https://github.com/ReactiveCocoa/ReactiveCocoa# ; 几个常见的概念Signal and Subscriber Signal获取到数据后,会调用Subscriber的sendNext,sendComplete,sendError方法来传送数据给Subscriber,Subscriber自然也有方法来获取传过来的数据,如:[signal subscribeNext:error:completed]。这样只要没有sendComplete和sendError,新的值就会通过sendNext源源不断地传送过来,举个简单的例子: [RACObserve(self,username) subscribeNext: ^(NSString *newName){
NSLog(@"newName:%@",newName);
}];
RACObserve使用了KVO来监听property的变化,只要username被自己或外部改变,block就会被执行。但不是所有的property都可以被RACObserve,该property必须支持KVO,比如NSURLCache的currentDiskUsage就不能被RACObserve。 Signal是很灵活的,它可以被修改(map),过滤(filter),叠加(combine),串联(chain),这有助于应对更加复杂的情况,比如: RAC(self.logInButton,enabled) = [RACSignal
combineLatest:@[
self.usernameTextField.rac_textSignal,self.passwordTextField.rac_textSignal,RACObserve(LoginManager.sharedManager,loggingIn),RACObserve(self,loggedIn)
] reduce:^(NSString *username,NSString *password,NSNumber *loggingIn,NSNumber *loggedIn) {
return @(username.length > 0 && password.length > 0 && !loggingIn.boolValue && !loggedIn.boolValue);
}];
这段代码看起来有点复杂,来细细说一下,首先是左边的RAC(…),它的作用是将self.logInButton.enabled属性与右边的signal的sendNext值绑定。也就是如果右边的reduce的返回值为NO,那么enabled就为NO。右边的combineLatest是获取这4个signal的next值。其中可以看到self.usernameTextField.rac_textSignal这么个东东,rac_textSignal是RAC为UITextField添加的category,只要usernameTextField的值有变化,这个值就会被返回(sendNext)。combineLatest需要每个signal至少都有过一次sendNext。reduce的作用是根据接收到的值,再返回一个新的值,这里是@(YES)和@(NO),必须是object。 上面这段代码用到了Signal的组合,想象一下,如果是传统的方式,写起来还是挺复杂的,而且随着功能的增加,调整起来会更加麻烦。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- swift – 使用#selector传递参数
- 设计模式六大原则(1):单一职责原则
- Cache Fetched AJAX Requests Locally: Wrapping the Fetch
- flash builder 4.7 #1014: 无法找到类 mx.core::BitmapAsse
- c# – 从asp.net中的dataSet获取一个值
- 常用的数据结构操作flash模拟演示
- c# – 将WPF Datagrid列设置为Combobox项目源
- jsf-2 – 如果编写@managed bean注释并在faces-config.xml中
- LayoutInflater作用是将layout的xml布局文件实例化为View类
- objective-c – – [NSObject isEqual:]和 – [NSNumber i