PS: 新公司代码好多用了RAC 还有MVVM这一套,所以熟悉一下,阅读代码可以比较畅通无阻。
看了很多貌似还是很多看不懂,anyway,先记录一下我看的。来个栗子。
1,一个发送信号,一个接收信号。(网络场景)
- (RACSignal *)createSignal{
RACSignal *signal = [RACSignal createSignal:^RACDisposable * _Nullable(id _Nonnull subscriber)
/* 发送信号 */
//延迟发送,就当是网络请求了。
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
ReturnModel *model = [ReturnModel new];
model.name = @"hello";
model.title = @"title";
[subscriber sendNext:model];
});
return nil;
}];
return signal;
}
//接收信号,就酱紫。简单模拟一个网络返回捕捉的
[[self createSignal] subscribeNext:^(ReturnModel * _Nullable response) {
//接收信号
NSLog(@"信号内容:%@", response.name);
}];
2,用RACCommond,应用场景,去捕捉一下Error
self.command = [[RACCommand alloc] initWithSignalBlock:^RACSignal * _Nonnull(id _Nullable input) {
return [RACSignal createSignal:^RACDisposable * _Nullable(id _Nonnull subscriber) {
if(1){
//如果成功了。那就万事大吉。
[subscriber sendCompleted];
}else{
//失败了,就抛出来。
NSError* error = [NSError errorWithDomain:@"failed"
code:@"0"
userInfo:@{NSLocalizedFailureReasonErrorKey:@"fa.."}];
[subscriber sendError:error];
}
//这里返回失败,这样后面可以捕捉
return [RACDisposable disposableWithBlock:^{
[subscriber sendError:nil];
}];
}];
}];
[[[self.command execute:@(1)] takeUntil:self.rac_willDeallocSignal].deliverOnMainThread subscribeError:^(NSError * _Nullable error) {
if ([error.domain isEqualToString:@"false"]) {
NSLog(@"123123");
} else if ([error.domain isEqualToString:@"failed"]) {
NSLog(@"45666");
}
} completed:^{
}];
3, 通过监听过滤后的信号量,来去做操作。
首先,单例里面信号量是这样。
- (RACSignal *_Nonnull)statusSignal {
__weak typeof(self) weakSelf = self;
return [RACSignal createSignal:^RACDisposable * _Nullable(id _Nonnull subscriber) {
__strong typeof(self) strongSelf = weakSelf;
[[RACObserve(strongSelf, newStatus) takeUntil:self.rac_willDeallocSignal] subscribeNext:^(id _Nullable x) {
[subscriber sendNext:[RACTuple tupleWithObjects:@(self.oldStatus), @(self.newStatus), nil]];
}];
return [RACDisposable disposableWithBlock:^{
}];
}];
}
过滤的代码
- (RACSignal * _Nonnull)statusReachableSignal {
__weak typeof(self) weakSelf = self;
return [[[self statusSignal] map:^id _Nullable(RACTuple * _Nullable value) {
return value.second;
}] filter:^BOOL(NSNumber * _Nullable value) {
__strong typeof(self) strongSelf = weakSelf;
if (value ==1)
return 1;
else return 0;
}];
}
外面VC监控单例的status
[[[[TestManager sharedManager] statusReachableSignal] takeUntil:self.rac_willDeallocSignal] subscribeNext:^(id _Nullable x) {
NSLog(@"3434");
}];
4,关于RACSubject,这个应该是最简单的了。
- (void)clickB{
[self.createButtonClickSubject sendNext:@"hello"];
}
- (RACSubject *)createButtonClickSubject{
if(!_createButtonClickSubject) {
_createButtonClickSubject = [RACSubject subject];
}
return _createButtonClickSubject;
}
[self.oView.createButtonClickSubject subscribeNext:^(id _Nullable x) {
NSLog(@"这边接受%@",x);
}];