簡體   English   中英

send() 僅在組合框架 iOS 中第一次被調用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM