适当的ReactiveCocoa链接

时间:2015-04-10 16:23:54

标签: ios swift reactive-programming reactive-cocoa

我创建了两个信号: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!")
})

2 个答案:

答案 0 :(得分:2)

所以你有一个连接信号,你想把它的值变成别的(删除)。

通常你会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,因为删除似乎不应该真正解决;它只是需要时间的东西。但这很容易改变。

答案 1 :(得分:1)

有几种方法可以做到这一点,具体取决于您对这些信号的触发频率以及是否有其他事情发生。

但首先想到的是-tryMap

    getConnection().tryMap { (value, error) -> AnyObject! in
        if let connection = value as? Connection {
            return connection.rac_delete()
        }
    }.subscribeError({ (error) -> Void in
        println("Error connecting or deleting: \(error)")
    }, completed: {
        println("Deleted successfully")
    })

请注意,您要做的事情是使用其他信号和过滤器建立您的信号,直到您拥有整个链,然后才添加订阅者。