![](/img/trans.png)
[英]iOS 13 Dark mode: traitCollectionDidChange only called the first time
[英]send() gets called only for the first time in combine framework iOS
每當我在 TextField 中輸入內容時,在將 UITextField 設為發布者之后,我都會通過“接收器”運算符獲取值。 但是,現在我想驗證該密碼,並且下面的代碼涉及“send()”,它僅在第一次調用 validatePassword() 方法時才有效。 之后,'send()' 不起作用。 知道為什么會這樣嗎? 我現在已經探索了 4-5 天,這里是要點:
1. 發布者、訂閱者和運營者。
2. ViewModel 中的發布者和 ViewController 中的訂閱者。
3. Send() 用於向訂閱者發送值。
一切都合適,但在第一次之后仍然沒有被調用。 現在堅持了3-4個小時。
這是 ViewController 的代碼
viewModel.passwordValidationResult
.print("Debugging")
.sink { completion in
switch completion {
case .finished:
print("c")
return
case .failure(_):
print("f")
return
}
} receiveValue: { _ in
print("v")
}
.store(in: &bindings)
}
這是 ViewModel 的代碼
class ViewModel
{
private var bindings = Set<AnyCancellable>()
@Published var emailValueChanged: String = String()
@Published var passwordValueChanged: String = String()
let passwordValidationResult = PassthroughSubject<Void, Error>()
//input
func validatePassword(_ password: String) {
if password.count >= 6 {
passwordValidationResult.send()
}
passwordValidationResult.send(completion: .failure(PasswordError.shortPassword))
}
}
問題是這一行:
passwordValidationResult.send(completion: .failure(PasswordError.shortPassword))
正如代碼所說,失敗是完成。 它結束了管道,它永遠不能用於其他任何事情。 你的 PassthroughSubject 現在已經死了。 這就是無法發送更多值的原因。
問題源於這個錯誤的選擇:
let passwordValidationResult = PassthroughSubject<Void, Error>()
你不希望你的信號是 Void 和 Error,你希望它們是 true 和 false(對於有效和無效):換句話說,你想要一個PassthroughSubject<Bool, Never>
。 或者,您可以使用專用枚舉來代替 Bool ,例如.valid
和.invalid
。 或者您可以傳遞一個 Result object,它本身有一個.success
案例和一個.failure
案例。
在任何情況下都不要發送完成,您希望能夠無限期地繼續發送信號。 不要在第一次“失敗”后切斷自己的生命。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.