适当的 ReactiveCocoa 链接
Proper ReactiveCocoa Chaining
我创建了两个信号:getConnection
和 connection.rac_delete()
。 connection.rac_delete()
取决于 getConnection
成功完成。
ReactiveCocoa
这样做的方法是什么?我目前有这个解决方案,但感觉不是正确的方法。
getConnection().subscribeNext({
let connection = [=10=] as! Connection
connection.rac_delete().subscribeNext({ success in
println("DELETED!")
}, error: { error in
println("ERROR DELETING!")
})
}, error: { error in
println("ERROR GETTING!")
})
有几种方法可以做到这一点,具体取决于您期望这些信号触发的频率以及是否有其他事情发生。
但是首先想到的是-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")
})
看,你要做的是使用其他信号和过滤器建立你的信号,直到你拥有整个链,然后才添加订阅者。
所以你有一个连接信号,你想把它的值变成其他东西(删除)。
通常你 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()
returns 只发送一个值的信号,它们在实践中可能表现相同,但值得意识到。
我在这里使用 subscribeCompleted
而不是 subscribeNext
因为删除似乎不应该真正解析为 value;这只是需要时间的事情。但这很容易改变。
我创建了两个信号:getConnection
和 connection.rac_delete()
。 connection.rac_delete()
取决于 getConnection
成功完成。
ReactiveCocoa
这样做的方法是什么?我目前有这个解决方案,但感觉不是正确的方法。
getConnection().subscribeNext({
let connection = [=10=] as! Connection
connection.rac_delete().subscribeNext({ success in
println("DELETED!")
}, error: { error in
println("ERROR DELETING!")
})
}, error: { error in
println("ERROR GETTING!")
})
有几种方法可以做到这一点,具体取决于您期望这些信号触发的频率以及是否有其他事情发生。
但是首先想到的是-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")
})
看,你要做的是使用其他信号和过滤器建立你的信号,直到你拥有整个链,然后才添加订阅者。
所以你有一个连接信号,你想把它的值变成其他东西(删除)。
通常你 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()
returns 只发送一个值的信号,它们在实践中可能表现相同,但值得意识到。
我在这里使用 subscribeCompleted
而不是 subscribeNext
因为删除似乎不应该真正解析为 value;这只是需要时间的事情。但这很容易改变。