首页 RAC基本类介绍
文章
取消

RAC基本类介绍

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类的父类是RACQueueSchedulerRACQueueScheduler中有个方法

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)都会用到。

本文由作者按照 CC BY 4.0 进行授权

统一设计,iOS6也玩扁平化(转载)

杂记