PS: 新公司代碼好多用了RAC 還有MVVM這一套,所以熟悉一下,閱讀代碼可以比較暢通無阻。
看了很多貌似還是很多看不懂,anyway,先記錄一下我看的。來個(gè)栗子。
1,一個(gè)發(fā)送信號(hào),一個(gè)接收信號(hào)。(網(wǎng)絡(luò)場(chǎng)景)
- (RACSignal<ReturnModel *> *)createSignal{
RACSignal *signal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber)
/* 發(fā)送信號(hào) */
//延遲發(fā)送,就當(dāng)是網(wǎng)絡(luò)請(qǐng)求了。
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;
}
//接收信號(hào),就醬紫。簡單模擬一個(gè)網(wǎng)絡(luò)返回捕捉的
[[self createSignal] subscribeNext:^(ReturnModel * _Nullable response) {
//接收信號(hào)
NSLog(@"信號(hào)內(nèi)容:%@", response.name);
}];
2,用RACCommond,應(yīng)用場(chǎng)景,去捕捉一下Error
self.command = [[RACCommand alloc] initWithSignalBlock:^RACSignal * _Nonnull(id _Nullable input) {
return [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _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, 通過監(jiān)聽過濾后的信號(hào)量,來去做操作。
首先,單例里面信號(hào)量是這樣。
- (RACSignal<RACTuple *> *_Nonnull)statusSignal {
__weak typeof(self) weakSelf = self;
return [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _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監(jiān)控單例的status
[[[[TestManager sharedManager] statusReachableSignal] takeUntil:self.rac_willDeallocSignal] subscribeNext:^(id _Nullable x) {
NSLog(@"3434");
}];
4,關(guān)于RACSubject,這個(gè)應(yīng)該是最簡單的了。
- (void)clickB{
[self.createButtonClickSubject sendNext:@"hello"];
}
- (RACSubject *)createButtonClickSubject{
if(!_createButtonClickSubject) {
_createButtonClickSubject = [RACSubject subject];
}
return _createButtonClickSubject;
}
[self.oView.createButtonClickSubject subscribeNext:^(id _Nullable x) {
NSLog(@"這邊接受%@",x);
}];