ios - 为什么 RACCommand 的 block 返回信号?

标签 ios objective-c reactive-programming reactive-cocoa

我学习了很多关于 ReactiveCocoa 的知识但有一件事仍然让我感到困惑:为什么 RACCommand 上的信号 block 本身会返回一个信号?

我了解 RACCommand 的用例、它的 canExecute 信号和信号 block ,以及它如何连接到 UI 元素。但是什么情况下会返回 [RACSignal empty] 以外的东西?

infoButton.rac_command = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) {
    // Do stuff

    return [RACSignal empty];
}];

最佳答案

每个规则都有异常(exception),但通常您希望所有“//Do stuff”都被返回的信号捕获。换句话说,你的例子会更好:

infoButton.rac_command = [[RACCommand alloc] initWithSignalBlock:^(id input) {
    return [RACSignal defer:^{
        // Do stuff

        return [RACSignal empty];
    }];
}];

此更改的直接好处是,在“//Do stuff”期间,您的 infoButton 将被禁用,防止它被点击/点击直到返回的信号完成。在您的原始代码中,“做事”在信号之外,因此您的按钮不会被正确禁用。

对于没有太多延迟的工作,例如响应按钮点击而更改 UI,那么 RACCommand 的启用/禁用功能不会给您带来太多好处。但是,如果工作是网络请求或其他一些可能长时间运行的工作(例如媒体处理),那么您肯定希望在信号中捕获所有这些工作。

关于ios - 为什么 RACCommand 的 block 返回信号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19440683/

相关文章:

IOS7 在调用 viewDidAppear 方法之前获取 UITextView contentSize?

ios - 如何设置 UItextview 边框的阴影?

ios - 使用 IOS SDK 将报告的属性发送到 Azure IOT Central

iphone - 如何将具有两个部分的 TableView 添加到 UIScrollView 作为 subview

objective-c - 如何在从 NSMutableData 读取的 NSInputStream 上发出 NSStreamEventEndEncountered 信号

iphone - 我需要释放返回的 NSError 对象吗?

node.js - 将三个不同的函数映射到 Node.js 中的 Observable

objective-c - 防止 iCloud 打开文件对话框在 OS X 启动时出现

c# - 使用 Rx.NET 的信号过滤器

java - Webflux如何从流内部设置cookie