【问题标题】:RACCommand compilation failure on swift 1.2swift 1.2 上的 RACCommand 编译失败
【发布时间】:2015-05-01 22:23:06
【问题描述】:

我有一个登录按钮,其中分配了一个 RACCommand 来执行登录请求并返回一个用户对象。

我想处理来自按钮信号错误的错误。

loginButton.rac_command.executionSignals.flatten()
            .logAll()
            .subscribeNext { (_:AnyObject!) -> Void in
                    println("Sent next")
            }

所以我在 subscribeNext 块之前添加了 doError 块,但现在代码无法编译:

    loginButton.rac_command.executionSignals.flatten()
        .logAll()
        .doError { (err:NSError) -> Void in
            println(err.description)
        }
        .subscribeNext { (_:AnyObject!) -> Void in
                println("Sent next")
        }

现在它返回错误:

cannot invoke 'subscribeNext' with an argument list of type '(AnyObject! -> Void)'

由于doError的签名是:

- (RACSignal *)doError:(void (^)(NSError *error))block;

我假设它返回给我传递给 doError 块的相同信号,所以我可以订阅它。

不知道为什么这根本无法编译。 非常感谢您对此问题的任何见解。

【问题讨论】:

    标签: ios swift compiler-errors reactive-cocoa


    【解决方案1】:

    Typo 在doError() 的参数中(并且被编译器错误地识别):它应该是(NSError!) -> Void 类型而不是(NSError) -> Void。像这样修改它编译得很好:

    loginButton.rac_command.executionSignals.flatten()
        .logAll()
        .doError { (err:NSError!) -> Void in
            println(err.description)
        }
        .subscribeNext { (_:AnyObject!) -> Void in
                println("Sent next")
        }
    

    补充说明

    • 来自RACCommand 的错误在内部被捕获并在errors() 上发送 信号,所以不会在executionSignals() 信号上发送。
    • doNext(), doError(), doComplete() 方法用于 给信号注入副作用。所以你通常在使用它们时 创建信号,而不是在处理其事件时。您可能想使用 subscribeNext(nextBlock:error:completed:) 方法(或其便利形式之一)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      • 2021-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多