# 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
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
这里为你收集整理了关于毕业设计、课程设计可参考借鉴的资料一份,质量非常高,如果你投入时间去研究几天相信肯定对你有很大的帮助。到时候你会回来感谢我的。 本资源是经过本地编译测试、可打开、可运行的项目、文件或源码,可以用于毕业设计、课程设计的应用、参考和学习需求,请放心下载。 祝愿你在这个毕业设计项目中取得巨大进步,顺利毕业! 但还需强调一下,这些项目源码仅供学习和研究之用。在使用这些资源时,请务必遵守学术诚信原则和相关法律法规,不得将其用于任何商业目的或侵犯他人权益的行为。对于任何因使用本资源而导致的问题,包括但不限于数据丢失、系统崩溃或安全漏洞,风险自担哦! 如有侵权,请联系博主删除。
资源推荐
资源详情
资源评论
收起资源包目录
毕业设计-iOS 组件化开发项目架构设计结合 MVVM 设计模式 RAC 数据绑定 Pod 组件管理 实现一.zip (1539个子文件)
fishhook.c 8KB
RACSignalProvider.d 222B
RACCompoundDisposableProvider.d 190B
FILE_LICENSE 4B
RACSignal+Operations.h 33KB
RACmetamacros.h 30KB
RACSignal.h 23KB
RACSequence.h 18KB
RACStream.h 14KB
SDWebImageManager.h 14KB
IQKeyboardManager.h 14KB
NSButton+WebCache.h 12KB
UIButton+WebCache.h 11KB
SDImageCache.h 11KB
NSObject+MJKeyValue.h 10KB
SDWebImageDownloader.h 10KB
RACTuple.h 9KB
UIImageView+WebCache.h 9KB
IQUIView+IQKeyboardToolbar.h 9KB
HMSegmentedControl.h 8KB
MASConstraint.h 8KB
WLPickerViewManager.h 7KB
UIView+WebCache.h 7KB
RACScheduler.h 7KB
MASUtilities.h 6KB
IQKeyboardManagerConstants.h 6KB
MASConstraintMaker.h 6KB
UIView+Borders.h 5KB
View+MASAdditions.h 5KB
RACCommand.h 5KB
SDWebImageDownloaderOperation.h 5KB
View+MASShorthandAdditions.h 5KB
NSObject+RACPropertySubscribing.h 5KB
SDWebImageTransition.h 5KB
RACKVOChannel.h 5KB
IQUIView+Hierarchy.h 4KB
UIImageView+HighlightedWebCache.h 4KB
RACEXTScope.h 4KB
SDWebImageCoder.h 4KB
SDWebImagePrefetcher.h 4KB
ReactiveObjC.h 4KB
FBObjectGraphConfiguration.h 4KB
NSObject+RACSelectorSignal.h 4KB
RACEXTRuntimeExtensions.h 3KB
IQKeyboardReturnKeyHandler.h 3KB
NSObject+MJProperty.h 3KB
FontConst.h 3KB
SDImageCacheConfig.h 3KB
FBRetainCycleDetector.h 3KB
RACChannel.h 3KB
NSObject+MJClass.h 3KB
fishhook.h 3KB
NSArray+MASAdditions.h 3KB
SDWebImageCompat.h 3KB
MJExtensionConst.h 3KB
WLFormItemViewModel.h 2KB
IQUITextFieldView+Additions.h 2KB
RACEXTKeyPathCoding.h 2KB
IQTitleBarButtonItem.h 2KB
SDWebImageCoderHelper.h 2KB
FBObjectiveCGraphElement.h 2KB
SDWebImageCodersManager.h 2KB
RACSubscriptingAssignmentTrampoline.h 2KB
IQUIViewController+Additions.h 2KB
UIBarButtonItem+WLButtonItem.h 2KB
IQBarButtonItem.h 2KB
IQToolbar.h 2KB
ColorConst.h 2KB
NSObject+RACLifting.h 2KB
NSObject+RACKVOWrapper.h 2KB
RACMulticastConnection.h 2KB
UIAlertView+RACSignalSupport.h 2KB
NSInvocation+RACTypeParsing.h 2KB
WLFormSectionViewModel.h 2KB
IQTextView.h 2KB
UILabel+WLLineSpace.h 2KB
MASConstraint+Private.h 2KB
RACCompoundDisposable.h 2KB
RACEvent.h 2KB
RACSubscriber.h 2KB
UIViewController+WLNavigationItem.h 2KB
IQNSArray+Sort.h 2KB
RACSerialDisposable.h 2KB
IQUIScrollView+Additions.h 2KB
UIImage+MultiFormat.h 2KB
MJProperty.h 2KB
IQPreviousNextView.h 1KB
IQKeyboardManagerConstantsInternal.h 1KB
FBStandardGraphEdgeFilters.h 1KB
FBRetainCycleUtils.h 1KB
RACTestScheduler.h 1KB
UIView+WebCacheOperation.h 1KB
FBStructEncodingParser.h 1KB
RACQueueScheduler+Subclass.h 1KB
FBBlockInterface.h 1KB
NSString+MJExtension.h 1KB
RACKVOProxy.h 1KB
MASViewConstraint.h 1KB
UIImagePickerController+RACSignalSupport.h 1KB
Struct.h 1KB
共 1539 条
- 1
- 2
- 3
- 4
- 5
- 6
- 16
资源评论
高校毕业设计
- 粉丝: 215
- 资源: 383
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功