为什么不调用 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 会看到事件。