RACCommand:RAC中用于处理事件的类,可以把事件如何处理,事件中的数据如何传递,包装到这个类中,他可以很方便的监控事件的执行过程。
使用场景:按钮点击、网络请求
使用步骤:
1.创建命令 initWithSignalBlock:(RACSignal * (^)(id input))signalBlock
2.在signalBlock中,创建RACSignal,并且作为signalBlock的返回值
3.执行命令 - (RACSignal *)execute:(id)input
注意事项:
1.signalBlock必须要返回一个信号,不能传nil.
2.如果不想要传递信号,直接创建空的信号[RACSignal empty];
3.RACCommand中信号如果数据传递完,必须调用[subscriber sendCompleted],这时命令才会执行完毕,否则永远处于执行中。
设计思想:内部signalBlock为什么要返回一个信号,这个信号有什么用。
1.在RAC开发中,通常会把网络请求封装到RACCommand,直接执行某个RACCommand就能发送请求。
2.当RACCommand内部请求到数据的时候,需要把请求的数据传递给外界,这时候就需要通过signalBlock返回的信号传递了。
如何获取信号发出的数据?
1.RACCommand有个执行信号源executionSignals,这个是signal of signals(信号的信号),意思是信号发出的数据是信号,不是普通的类型。
2.订阅executionSignals就能拿到RACCommand中返回的信号,然后订阅signalBlock返回的信号,就能获取发出的值。
Code
@weakify(self)
self.command = [[RACCommand alloc] initWithSignalBlock:^RACSignal * _Nonnull(id _Nullable input) {
return [[RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
@strongify(self)//紧贴着调用self的地方呗
[subscriber sendNext:@"数据"];
[subscriber sendCompleted];
return nil;
}] materialize];
}];
[self.command.executionSignals subscribeNext:^(RACSignal *signal) {
[[[signal dematerialize] deliverOn:[RACScheduler mainThreadScheduler]] subscribeNext:^(id _Nullable x) {
@strongify(self)
//拿到x(@"数据")喽
} error:^(NSError * _Nullable error) {
}];
}];
本文详细介绍了RACCommand在响应式编程中的应用,包括其在处理事件和数据传递中的作用,以及如何创建和执行RACCommand。同时,文章还探讨了RACCommand的设计思想和注意事项。
469

被折叠的 条评论
为什么被折叠?



