2015-05-01 35 views
0

我有一个登录按钮,RACCommand被分配给它执行登录请求并返回一个用户对象。RACCommand在swift编译失败1.2

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

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

所以我说的doError块subscribeNext块之前,但现在的代码不能编译:

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块的相同信号,所以我可以订阅它。

不知道为什么这不能编译,但。 对此问题的任何洞察力都非常感谢。

回答

0

输入错误的参数是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:)方法(或其中一种方便形式)。
+0

太棒了,谢谢@Jakub清理出来。 –