RAC基本类介绍
RACTuple
父类 | NSObject | |
---|---|---|
子类 | 无 | |
类含义 | RAC元素类 | |
遵循的协议 | <NSCopying> <NSCoding> <NSFastEnumeration> | |
属性 | NSUInteger count | 包含元素的个数 |
id first; | 元素数组第一个 | |
id second; | 元素数组第二个 | |
id third | 元素数组第三个 | |
id fourth | 元素数组第四个 | |
id fifth | 元素数组第五个 | |
id last | 元素数组最后一个 |
例子
1
2
3
4
[[self rac_signalForSelector:@selector(tabBarController:didSelectViewController:) fromProtocol:@protocol(UITabBarControllerDelegate)] subscribeNext:^(RACTuple *tuple) {
NSLog(@"%@", tuple.first);
NSLog(@"%@", tuple.second);
}];
1
2
3
[[RACSignal combineLatest:@[self.textView.rac_textSignal]] subscribeNext:^(id x) {
NSLog(@"%@", [x class]);
}];
方法介绍
1.初始化一个RACTuple对象数据来自一个数组
1
+ (instancetype)tupleWithObjectsFromArray:(NSArray *)array;
2.初始化一个RACTuple对象数据来自一个数组
1
+ (instancetype)tupleWithObjectsFromArray:(NSArray *)array convertNullsToNils:(BOOL)convert;
如果convert
设置为YES,那么NSNull
值会被转换为RACTupleNil
3.初始化一个RACTuple对象数据来自一个数组
1
+ (instancetype)tupleWithObjects:(id)object, ... NS_REQUIRES_NIL_TERMINATION;
4.返回元素数组
1
- (NSArray *)allObjects;
5.增加元素
1
- (instancetype)tupleByAddingObject:(id)obj;
RACScheduler
父类 | NSObject |
---|---|
子类 | RACImmediateScheduler |
RACQueueScheduler | |
RACSubscriptionScheduler | |
RACTestScheduler | |
类含义 | RAC调度类 |
遵循的协议 | 无 |
属性 | 无 |
例子 显示网络下载的图片
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
RAC(self.imageView, image) = [[RACSignal startEagerlyWithScheduler:[RACScheduler schedulerWithPriority:RACSchedulerPriorityBackground] block:^(id <RACSubscriber> subscriber) {
NSError *error;
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://ww3.sinaimg.cn/bmiddle/7128be06jw1ei4hfthoj3j20hs0bomyd.jpg"]
options:NSDataReadingMappedAlways
error:&error];
if(error) {
[subscriber sendError:error];
}
else {
[subscriber sendNext:[UIImage imageWithData:data]];
[subscriber sendCompleted];
}
}] deliverOn:[RACScheduler mainThreadScheduler]];
在后台线程立即发起一个请求,然后传递到主线程上更新UI
信号传递
1
2
3
- (RACSignal *)deliverOn:(RACScheduler *)scheduler;
返回的RACSignal会立即被部署
1
+ (RACSignal *)startEagerlyWithScheduler:(RACScheduler *)scheduler block:(void (^)(id<RACSubscriber> subscriber))block;
方法介绍
1.返回主线程
1
+ (RACScheduler *)mainThreadScheduler;
2.返回当前队列
1
+ (RACScheduler *)currentScheduler;
3.返回默认队列
1
+ (RACScheduler *)scheduler;
相当于
1
[RACScheduler schedulerWithPriority:RACSchedulerPriorityDefault];
4.指定等级的异步并发队列
1
+ (RACScheduler *)schedulerWithPriority:(RACSchedulerPriority)priority;
这个其实调用的是
1
[[RACTargetQueueScheduler alloc] initWithName:name targetQueue:dispatch_get_global_queue(priority, 0)];
其实RACTargetQueueScheduler
类的父类是RACQueueScheduler
,RACQueueScheduler
中有个方法
1
2
3
4
5
6
7
8
9
- (RACDisposable *)schedule:(void (^)(void))block {
NSCParameterAssert(block != NULL);
RACDisposable *disposable = [[RACDisposable alloc] init];
dispatch_async(self.queue, ^{
if (disposable.disposed) return;
[self performAsCurrentScheduler:block];
});
return disposable;
}
可以看到最终用的还是dispatch_async
的异步调用 __
RACEvent
父类 | NSObject | |
---|---|---|
子类 | 无 | |
遵循的协议 | <NSCopying> | |
属性 | RACEventType eventType | 事件类型 |
BOOL finished | 是否完成 | |
NSError *error | 错误信息 | |
id value | 对应的值 |
RACEventType包括
1
2
3
4
5
typedef enum : NSUInteger {
RACEventTypeCompleted,
RACEventTypeError,
RACEventTypeNext
} RACEventType;
例子
1
2
3
4
5
6
7
8
9
10
11
RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
[subscriber sendNext:@"1"];
[subscriber sendNext:@"43"];
[subscriber sendNext:@"3"];
[subscriber sendCompleted];
return nil;
}];
[[signal materialize] subscribeNext:^(RACEvent *event) {
NSLog(@"value--%@ eventType--%d", event.value, event.eventType);
}];
- (RACSignal *)materialize;
将信号接收的信息以RACEvent的形式传递
1
2
3
4
2014-07-03 14:05:24.972 RAC-Demo[6528:60b] value--1 eventType--2
2014-07-03 14:05:24.973 RAC-Demo[6528:60b] value--2 eventType--2
2014-07-03 14:05:24.974 RAC-Demo[6528:60b] value--3 eventType--2
2014-07-03 14:05:24.974 RAC-Demo[6528:60b] value--(null) eventType--0
RACDelegateProxy
父类 | NSObject |
---|---|
子类 | 无 |
类含义 | RAC代理类 |
遵循的协议 | 无 |
属性 | RACDelegateProxy *rac_delegateProxy; |
这个类平常使用中可能用的不多,比如界面中多个UITextfield
,但是各个在代理方法中要做的事情不同,或者说有些需要实现有些不需要。
1
2
3
4
5
6
7
8
9
RACDelegateProxy *delegateProxy = [[RACDelegateProxy alloc]initWithProtocol:@protocol(UITextFieldDelegate)];
[[delegateProxy rac_signalForSelector:@selector(textFieldShouldReturn:)] subscribeNext:^(RACTuple *args) {
UITextField *field = [args first];
[field resignFirstResponder];
}];
self.textfield.delegate = (id<UITextFieldDelegate>)delegateProxy;
objc_setAssociatedObject(self.textfield, _cmd, delegateProxy, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
上面的代码片段就明确指定self.textfield
的- (BOOL)textFieldShouldReturn:(UITextField *)textField;
会被执行。还需要注意的是,delegateProxy
可能会无缘无故的被释放掉而crash,所以需要保留它,最后一句代码的作用就是这个。 虽然这个类在实际使用中作用不大,但是在RAC内部像UITextView (RACSignalSupport)
UIAlertView (RACSignalSupport)
都会用到。