RAC命令混乱

RACCommand Confusion

我正在尝试在我的 PasswordResetViewController 上使用 RACCommand。在我的 viewDidLoad 中,我有以下内容:

sendButtonItem = UIBarButtonItem(title: "Reset Password", style: .Done, target: self, action: nil)

var emailIsValid = textField.rac_textSignal().map { text -> AnyObject! in
    return count((text as! String)) > 0
}

let passwordResetSignal = RACSignal.createSignal { (subscriber) -> RACDisposable! in
    User.requestPasswordResetForEmailInBackground(self.textField.text) { success, error in
        if success {
            subscriber.sendNext(success)
            subscriber.sendCompleted()
        } else {
            subscriber.sendError(error)
        }
    }

    return nil
}

sendButtonItem.rac_command = RACCommand(enabled: emailIsValid) { (input) in
    return passwordResetSignal
}

sendButtonItem.rac_command.executionSignals.subscribeError { (error) -> Void in
    println("ERROR!")
}

sendButtonItem.rac_command.executionSignals.subscribeNext { (success) -> Void in
    println("SUCCESS!")
}

navigationItem.rightBarButtonItem = sendButtonItem

rightBarButtonItem enables/disables 如我所料,但我没有收到任何下一个或错误事件。

executionSignals 是一个 信号中的一个信号 。换句话说:每次执行命令时,它都会发送命令的 signal(在您的例子中,passwordResetSignal)作为其下一个值。

如果您想订阅从 passwordResetSignal 发送的值,请使用 switchToLatest:

sendButtonItem.rac_command.executionSignals.switchToLatest().subscribeNext { (success) -> Void in
    println("SUCCESS!")
}

RACCommand 中有一个单独的信号 errors 可用于订阅从执行信号接收到的错误(注意:错误作为 next 值发送):

sendButtonItem.rac_command.errors.subscribeNext { (error) -> Void in
    println("ERROR!")
}