当我们在日常开发中,如果涉及到一些iOS底层的东西就可能会遇到方法编码,这是了解这门语言必不可少的一个环节。
阅读全文
&SideTables()[oldObj]这是什么?很多人看到这里都被这操作搞蒙了,下面分三步来理解,分别是SideTables()、[oldObj]、&。先贴上入口的代码
&SideTables()[oldObj]
SideTables()
[oldObj]
&
id oldObj; SideTable *oldTable; oldObj = *location; oldTable = &SideTables()[oldObj];
本文较长分三篇按序阅读体验更佳,第四篇为辅助阅读按需看
带着问题看源码:
SideTable
weak_entry_t
weak_entries
只要merge之后生成的信号被订阅就会自动触发所有压缩信号的订阅回调,如果靠前的信号出现了error后面的信号不再发送。
merge
error
核心方法:- (instancetype)flatten 值:多次收到,分开的
- (instancetype)flatten
1 2
RACSignal *s1 = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) { [subscriber sendNext:@"1"]; return nil; }]; RACSignal *s2 = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) { [subscriber sendNext:@"2"]; return nil; }]; [[RACSignal merge:@[s1,s2]] subscribeNext:^(id x) { NSLog(@"%@",x); }];
将冷信号包装成热信号,初始化冷信号,调用publish方法会自动生成一个RACMulticastConnection,该对象持有了原始信号和一个热信号。
publish
RACMulticastConnection
- (RACMulticastConnection *)publish { RACSubject *subject = [[RACSubject subject] setNameWithFormat:@"[%@] -publish", self.name]; RACMulticastConnection *connection = [self multicast:subject]; return connection; } - (RACMulticastConnection *)multicast:(RACSubject *)subject { [subject setNameWithFormat:@"[%@] -multicast: %@", self.name, subject.name]; RACMulticastConnection *connection = [[RACMulticastConnection alloc] initWithSourceSignal:self subject:subject]; return connection; }
调用connect方法来触发订阅,注意调用一次触发一次。
connect
RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) { [subscriber sendNext:@"1"]; return nil; }];
分析
//RACSignal.m + (RACSignal *)createSignal:(RACDisposable * (^)(id<RACSubscriber> subscriber))didSubscribe { return [RACDynamicSignal createSignal:didSubscribe]; }
- (RACSignal *)switchToLatest和- (RACSignal *)flatten的功能类似,都可以将信号中的信号的值取出来。不同的是,前者如果订阅者处理多个信号,只有最后一个信号的值能收到,之前的信号会被销毁。而后者则都能收到所有值。
- (RACSignal *)switchToLatest
- (RACSignal *)flatten
- (RACSignal *)concat:(RACSignal *)signal
//源码 - (RACSignal *)concat:(RACSignal *)signal { return [[RACSignal createSignal:^(id<RACSubscriber> subscriber) { RACSerialDisposable *serialDisposable = [[RACSerialDisposable alloc] init]; RACDisposable *sourceDisposable = [self subscribeNext:^(id x) { [subscriber sendNext:x]; } error:^(NSError *error) { [subscriber sendError:error]; } completed:^{ RACDisposable *concattedDisposable = [signal subscribe:subscriber]; serialDisposable.disposable = concattedDisposable; }]; serialDisposable.disposable = sourceDisposable; return serialDisposable; }] setNameWithFormat:@"[%@] -concat: %@", self.name, signal]; }