# ReactiveObjC
_NOTE: This is legacy introduction to the Objective-C ReactiveCocoa, which is
now known as ReactiveObjC. For the updated version that uses Swift, please see
[ReactiveCocoa][] or [ReactiveSwift][]_
ReactiveObjC (formally ReactiveCocoa or RAC) is an Objective-C framework
inspired by [Functional Reactive Programming][]. It provides APIs for
**composing and transforming streams of values**.
If you're already familiar with functional reactive programming or know the basic
premise of ReactiveObjC, check out the other documentation in this folder for a
framework overview and more in-depth information about how it all works in practice.
## New to ReactiveObjC?
ReactiveObjC is documented like crazy, and there's a wealth of introductory
material available to explain what RAC is and how you can use it.
If you want to learn more, we recommend these resources, roughly in order:
1. [Introduction](#introduction)
1. [When to use ReactiveObjC](#when-to-use-reactiveobjc)
1. [Framework Overview][]
1. [Basic Operators][]
1. [Header documentation](ReactiveObjC/)
1. Previously answered [Stack Overflow](https://github.com/ReactiveCocoa/ReactiveCocoa/wiki)
questions and [GitHub issues](https://github.com/ReactiveCocoa/ReactiveCocoa/issues?labels=question&state=closed)
1. The rest of this folder
1. [Functional Reactive Programming on iOS](https://leanpub.com/iosfrp/)
(eBook)
If you have any further questions, please feel free to [file an issue](https://github.com/ReactiveCocoa/ReactiveObjC/issues/new).
## Introduction
ReactiveObjC is inspired by [functional reactive
programming](http://blog.maybeapps.com/post/42894317939/input-and-output).
Rather than using mutable variables which are replaced and modified in-place,
RAC provides signals (represented by `RACSignal`) that capture present and
future values.
By chaining, combining, and reacting to signals, software can be written
declaratively, without the need for code that continually observes and updates
values.
For example, a text field can be bound to the latest time, even as it changes,
instead of using additional code that watches the clock and updates the
text field every second. It works much like KVO, but with blocks instead of
overriding `-observeValueForKeyPath:ofObject:change:context:`.
Signals can also represent asynchronous operations, much like [futures and
promises][]. This greatly simplifies asynchronous software, including networking
code.
One of the major advantages of RAC is that it provides a single, unified
approach to dealing with asynchronous behaviors, including delegate methods,
callback blocks, target-action mechanisms, notifications, and KVO.
Here's a simple example:
```objc
// When self.username changes, logs the new name to the console.
//
// RACObserve(self, username) creates a new RACSignal that sends the current
// value of self.username, then the new value whenever it changes.
// -subscribeNext: will execute the block whenever the signal sends a value.
[RACObserve(self, username) subscribeNext:^(NSString *newName) {
NSLog(@"%@", newName);
}];
```
But unlike KVO notifications, signals can be chained together and operated on:
```objc
// Only logs names that starts with "j".
//
// -filter returns a new RACSignal that only sends a new value when its block
// returns YES.
[[RACObserve(self, username)
filter:^(NSString *newName) {
return [newName hasPrefix:@"j"];
}]
subscribeNext:^(NSString *newName) {
NSLog(@"%@", newName);
}];
```
Signals can also be used to derive state. Instead of observing properties and
setting other properties in response to the new values, RAC makes it possible to
express properties in terms of signals and operations:
```objc
// Creates a one-way binding so that self.createEnabled will be
// true whenever self.password and self.passwordConfirmation
// are equal.
//
// RAC() is a macro that makes the binding look nicer.
//
// +combineLatest:reduce: takes an array of signals, executes the block with the
// latest value from each signal whenever any of them changes, and returns a new
// RACSignal that sends the return value of that block as values.
RAC(self, createEnabled) = [RACSignal
combineLatest:@[ RACObserve(self, password), RACObserve(self, passwordConfirmation) ]
reduce:^(NSString *password, NSString *passwordConfirm) {
return @([passwordConfirm isEqualToString:password]);
}];
```
Signals can be built on any stream of values over time, not just KVO. For
example, they can also represent button presses:
```objc
// Logs a message whenever the button is pressed.
//
// RACCommand creates signals to represent UI actions. Each signal can
// represent a button press, for example, and have additional work associated
// with it.
//
// -rac_command is an addition to NSButton. The button will send itself on that
// command whenever it's pressed.
self.button.rac_command = [[RACCommand alloc] initWithSignalBlock:^(id _) {
NSLog(@"button was pressed!");
return [RACSignal empty];
}];
```
Or asynchronous network operations:
```objc
// Hooks up a "Log in" button to log in over the network.
//
// This block will be run whenever the login command is executed, starting
// the login process.
self.loginCommand = [[RACCommand alloc] initWithSignalBlock:^(id sender) {
// The hypothetical -logIn method returns a signal that sends a value when
// the network request finishes.
return [client logIn];
}];
// -executionSignals returns a signal that includes the signals returned from
// the above block, one for each time the command is executed.
[self.loginCommand.executionSignals subscribeNext:^(RACSignal *loginSignal) {
// Log a message whenever we log in successfully.
[loginSignal subscribeCompleted:^{
NSLog(@"Logged in successfully!");
}];
}];
// Executes the login command when the button is pressed.
self.loginButton.rac_command = self.loginCommand;
```
Signals can also represent timers, other UI events, or anything else that
changes over time.
Using signals for asynchronous operations makes it possible to build up more
complex behavior by chaining and transforming those signals. Work can easily be
triggered after a group of operations completes:
```objc
// Performs 2 network operations and logs a message to the console when they are
// both completed.
//
// +merge: takes an array of signals and returns a new RACSignal that passes
// through the values of all of the signals and completes when all of the
// signals complete.
//
// -subscribeCompleted: will execute the block when the signal completes.
[[RACSignal
merge:@[ [client fetchUserRepos], [client fetchOrgRepos] ]]
subscribeCompleted:^{
NSLog(@"They're both done!");
}];
```
Signals can be chained to sequentially execute asynchronous operations, instead
of nesting callbacks with blocks. This is similar to how [futures and promises][]
are usually used:
```objc
// Logs in the user, then loads any cached messages, then fetches the remaining
// messages from the server. After that's all done, logs a message to the
// console.
//
// The hypothetical -logInUser methods returns a signal that completes after
// logging in.
//
// -flattenMap: will execute its block whenever the signal sends a value, and
// returns a new RACSignal that merges all of the signals returned from the block
// into a single signal.
[[[[client
logInUser]
flattenMap:^(User *user) {
// Return a signal that loads cached messages for the user.
return [client loadCachedMessagesForUser:user];
}]
flattenMap:^(NSArray *messages) {
// Return a signal that fetches any remaining messages.
return [client fetchMessagesAfterMessage:messages.lastObject];
}]
subscribeNext:^(NSArray *newMessages) {
NSLog(@"New messages: %@", newMessages);
} completed:^{
NSLog(@"Fetched all messages.");
}];
```
RAC even makes it easy to bind to the result of an asynchronous operation:
```objc
// Creates a one-way binding so that self.imageView.image will be set as the user's
// avatar as soon as it's
没有合适的资源?快使用搜索试试~ 我知道了~
毕业设计项目:蓝牙灯。支持一键设置情景模式、无极调光调色。.zip
共1324个文件
h:426个
m:395个
png:297个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 136 浏览量
2023-10-26
20:16:24
上传
评论
收藏 40.44MB ZIP 举报
温馨提示
matlab算法,毕设、课设程序,全部源码均已进行严格测试,可以直接运行! matlab算法,毕设、课设程序,全部源码均已进行严格测试,可以直接运行! matlab算法,毕设、课设程序,全部源码均已进行严格测试,可以直接运行! matlab算法,毕设、课设程序,全部源码均已进行严格测试,可以直接运行! matlab算法,毕设、课设程序,全部源码均已进行严格测试,可以直接运行! matlab算法,毕设、课设程序,全部源码均已进行严格测试,可以直接运行! matlab算法,毕设、课设程序,全部源码均已进行严格测试,可以直接运行! matlab算法,毕设、课设程序,全部源码均已进行严格测试,可以直接运行! matlab算法,毕设、课设程序,全部源码均已进行严格测试,可以直接运行! matlab算法,毕设、课设程序,全部源码均已进行严格测试,可以直接运行! matlab算法,毕设、课设程序,全部源码均已进行严格测试,可以直接运行! matlab算法,毕设、课设程序,全部源码均已进行严格测试,可以直接运行! matlab算法,毕设、课设程序,全部源码均已进行严格测试,可以直接运行! matlab算法,毕设、课设程序,全部源码均已进行严格测试,可以直接运行!
资源推荐
资源详情
资源评论
收起资源包目录
毕业设计项目:蓝牙灯。支持一键设置情景模式、无极调光调色。.zip (1324个子文件)
smartlamp.bloc 262KB
bootstrap.min.css 120KB
animate.min.css 39KB
font-awesome.min.css 30KB
style.css 19KB
RACSignalProvider.d 222B
RACCompoundDisposableProvider.d 190B
fontawesome-webfont.eot 162KB
pageload-spinner.gif 4KB
.gitignore 260B
NSAttributedString+YYText.h 57KB
FMDatabase.h 45KB
RACSignal+Operations.h 32KB
RACmetamacros.h 30KB
AFURLSessionManager.h 29KB
encode.h 26KB
SCLAlertView.h 24KB
mux.h 22KB
decode.h 22KB
YYTextLayout.h 22KB
AFURLRequestSerialization.h 21KB
RACSignal.h 21KB
AFHTTPSessionManager.h 19KB
YYImageCoder.h 18KB
RACSequence.h 18KB
YYTextView.h 17KB
YYTextAttribute.h 15KB
demux.h 15KB
YYDiskCache.h 15KB
YYLabel.h 14KB
RACStream.h 14KB
UIButton+WebCache.h 13KB
NSObject+YYModel.h 13KB
YYKeychain.h 13KB
NSString+YYAdd.h 12KB
UIImage+YYAdd.h 12KB
FMResultSet.h 12KB
AFURLResponseSerialization.h 12KB
UIColor+YYAdd.h 12KB
NSObject+YYAdd.h 12KB
YYKVStorage.h 11KB
YYCGUtilities.h 11KB
SDWebImageManager.h 11KB
NSObject+MJKeyValue.h 10KB
UIImageView+WebCache.h 10KB
YYKitMacro.h 10KB
UIButton+AFNetworking.h 10KB
YYWebImageManager.h 10KB
UIButton+YYWebImage.h 9KB
HYBNetworking.h 9KB
AFImageDownloader.h 9KB
SDImageCache.h 9KB
YYImageCache.h 8KB
YYClassInfo.h 8KB
AFNetworkReachabilityManager.h 8KB
UIControl+ATBlockWrapper.h 8KB
UITableView+YYAdd.h 8KB
UIImageView+YYWebImage.h 8KB
FMDatabaseAdditions.h 7KB
YYTextUtilities.h 7KB
YYCache.h 7KB
YYMemoryCache.h 7KB
NSData+YYAdd.h 7KB
SDWebImageDownloader.h 7KB
NSDate+YYAdd.h 7KB
RACScheduler.h 7KB
NSDictionary+YYAdd.h 6KB
UIDevice+YYAdd.h 6KB
FMDatabaseQueue.h 6KB
UIImageView+AFNetworking.h 6KB
AFSecurityPolicy.h 6KB
AFAutoPurgingImageCache.h 6KB
UIImage+ImageEffects.h 6KB
RACTuple.h 6KB
YYKit.h 5KB
NSArray+YYAdd.h 5KB
AFNetworkActivityIndicatorManager.h 5KB
MDTextField.h 5KB
UIImageView+HighlightedWebCache.h 5KB
FMDatabasePool.h 5KB
RACCommand.h 5KB
YYFileHash.h 5KB
NSObject+RACPropertySubscribing.h 5KB
RACKVOChannel.h 4KB
UIWebView+AFNetworking.h 4KB
NSString+ATFileStreamChainedWrapper.h 4KB
YYAnimatedImageView.h 4KB
UIFont+YYAdd.h 4KB
UIView+YYAdd.h 4KB
RACEXTScope.h 4KB
ATCentralManager.h 4KB
MJRefreshComponent.h 4KB
CALayer+YYWebImage.h 4KB
YYWebImageOperation.h 4KB
config.h 4KB
MKAnnotationView+YYWebImage.h 4KB
ReactiveObjC.h 4KB
format_constants.h 4KB
SDWebImagePrefetcher.h 4KB
YYFrameImage.h 4KB
共 1324 条
- 1
- 2
- 3
- 4
- 5
- 6
- 14
资源评论
天天501
- 粉丝: 599
- 资源: 4666
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功