我创建了两个信号:getConnectionconnection.rac_delete()connection.rac_delete()取决于getConnection成功完成。

这样做的ReactiveCocoa方法是什么?我目前有此解决方案,但感觉不正确。

getConnection().subscribeNext({
  let connection = $0 as! Connection

  connection.rac_delete().subscribeNext({ success in
    println("DELETED!")
  }, error: { error in
    println("ERROR DELETING!")
  })

}, error: { error in
  println("ERROR GETTING!")
})

最佳答案

因此,您有连接的信号,并且想要将其值转换为其他值(删除)。

通常,您将map信号获取新信号,但是在这里,您将map ping到另一个信号-map此时会为您提供信号信号。

但是您实际上并不需要信号,因为这样您就必须对结果执行此烦人的嵌套订阅业务:

// (pseudocode)
getConnection()
.map(connection -> connection.rac_delete())
.subscribeNext(deletionSignal ->
  deletionSignal.subscribeCompleted(->
    println("done deleting")))

这并不比您当前的嵌套订阅好-您只想将删除信号简化为删除信号,然后直接进行订阅。这就是flattenMap所做的!
// (pseudocode)
getConnection()
.flattenMap(connection -> connection.rac_delete())
.subscribeCompleted(->
  println("done deleting!"));

但是请注意,这的行为与以上代码不同,但仅当getConnection()的信号发送多个值时。以前,它将为完成删除的每个连接记录日志;现在,所有删除操作完成后,它将仅在末尾记录一次。

由于我假设getConnection()返回的信号仅发送一个值,因此它们在实践中的行为可能相同,但是值得一提。

我在这里使用subscribeCompleted而不是subscribeNext,因为删除似乎不应该真正解析为一个值。只是需要一些时间。但这很容易改变。

关于ios - 适当的 react 性 cocoa 链,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29566262/

10-11 02:25