为什么不调用 observeValues 块?
Why observeValues block not called?
尝试在我的项目中使用 ReativeSwift,但有些地方表现不佳
我检查了很多次,无法找出问题所在。
一切正常,就是没有调用。
class MSCreateScheduleViewModel: NSObject {
var scheduleModel = MSScheduleModel()
var validateAction: Action<(), Bool, NoError>!
override init() {
super.init()
validateAction = Action(execute: { (_) -> SignalProducer<Bool, NoError> in
return self.valiateScheduleModel()
})
validateAction.values.observeValues { (isok) in
print("isok??") //this line not called
}
validateAction.values.observeCompleted {
print("completed") //this line not called
}
}
func valiateScheduleModel() -> SignalProducer<Bool, NoError> {
let (signal, observer) = Signal<Bool, NoError>.pipe()
let signalProducer = SignalProducer<Bool, NoError>(_ :signal)
observer.send(value: true) //this line called
observer.sendCompleted() //this line called
return signalProducer
}
}
当您像在 valiateScheduleModel
中那样通过包装现有信号来创建 SignalProducer
时,生产者会在信号启动时观察信号并转发事件。这种情况下的问题是信号在生产者从函数返回并启动之前完成,因此没有事件被转发。
如果你想创建一个立即发送 true
并在启动时完成的生产者,那么你应该这样做:
func valiateScheduleModel() -> SignalProducer<Bool, NoError> {
return SignalProducer<Bool, NoError> { observer, lifetime in
observer.send(value: true)
observer.sendCompleted()
}
}
生产者启动后才会执行闭包,因此 Action
会看到事件。
尝试在我的项目中使用 ReativeSwift,但有些地方表现不佳 我检查了很多次,无法找出问题所在。 一切正常,就是没有调用。
class MSCreateScheduleViewModel: NSObject {
var scheduleModel = MSScheduleModel()
var validateAction: Action<(), Bool, NoError>!
override init() {
super.init()
validateAction = Action(execute: { (_) -> SignalProducer<Bool, NoError> in
return self.valiateScheduleModel()
})
validateAction.values.observeValues { (isok) in
print("isok??") //this line not called
}
validateAction.values.observeCompleted {
print("completed") //this line not called
}
}
func valiateScheduleModel() -> SignalProducer<Bool, NoError> {
let (signal, observer) = Signal<Bool, NoError>.pipe()
let signalProducer = SignalProducer<Bool, NoError>(_ :signal)
observer.send(value: true) //this line called
observer.sendCompleted() //this line called
return signalProducer
}
}
当您像在 valiateScheduleModel
中那样通过包装现有信号来创建 SignalProducer
时,生产者会在信号启动时观察信号并转发事件。这种情况下的问题是信号在生产者从函数返回并启动之前完成,因此没有事件被转发。
如果你想创建一个立即发送 true
并在启动时完成的生产者,那么你应该这样做:
func valiateScheduleModel() -> SignalProducer<Bool, NoError> {
return SignalProducer<Bool, NoError> { observer, lifetime in
observer.send(value: true)
observer.sendCompleted()
}
}
生产者启动后才会执行闭包,因此 Action
会看到事件。