我正在使用 Storyboard(UIKit) 构建表单。我有 4 个输入字段,当它有效时,我会将数据提交到 UI 并在 UI 上显示响应。我创建了一个 ViewModel 并在其中添加了验证代码。以下是我的验证代码:
@Published public var firstName = ""
@Published public var lastName = ""
@Published public var phoneNumber = ""
@Published public var emailAddress = ""
var isFirstNameValidPublisher: AnyPublisher<Bool, Never> {
$firstName
.map { name in
return name.count >= 3
}
.eraseToAnyPublisher()
}
var isLastNameValidPublisher: AnyPublisher<Bool, Never> {
$lastName
.map { name in
return name.count >= 3
}
.eraseToAnyPublisher()
}
var isUserEmailValidPublisher: AnyPublisher<Bool, Never> {
$emailAddress
.map { email in
let emailPredicate = NSPredicate(format:"SELF MATCHES %@", "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}")
return emailPredicate.evaluate(with: email)
}
.eraseToAnyPublisher()
}
var isPhoneNumberValidPublisher: AnyPublisher<Bool, Never> {
$phoneNumber
.map { phoneNumber in
return phoneNumber.count >= 8
}
.eraseToAnyPublisher()
}
public func isValidForm(firstName: String, lastName: String, phoneNum: String, emailAddress: String, isConsent: Bool) -> AnyPublisher<Bool, Never> {
self.firstName = firstName
self.lastName = lastName
self.phoneNumber = phoneNum
self.emailAddress = emailAddress
return Publishers.CombineLatest4(
isFirstNameValidPublisher,
isLastNameValidPublisher,
isUserEmailValidPublisher,
isPhoneNumberValidPublisher)
.map { isFirstNameValid, isLastNameValid, isPhoneNumberValid, isEmailValid in
return isFirstNameValid && isLastNameValid && isPhoneNumberValid && isEmailValid && isConsent
}
.eraseToAnyPublisher()
}
我试图在我的 ViewController 中单击提交按钮时使用它,如下所示:
cancellable = dependencies.leadConsumptionUseCase.isValidForm(firstName: firstNameTextView.text, lastName: lastNameTextView.text, phoneNum: phoneNumberTextView.text, emailAddress: emailTextView.text, isConsent: true).collect().sink(receiveCompletion: { completion in
print("completed")
print(completion)
}, receiveValue: { res in
print("result")
print(res)
})
我能够验证 ViewModel 中的字段,但不知怎的,我在 ViewController 中没有得到任何响应。
另外我不知道应该如何以及在哪里添加 api 调用。我已经创建了另一个服务类,其中有一个 api 调用,它将返回作为 AnyCancellable 的响应。
大多数相关示例都使用 SwiftUI,但我没有使用 SwiftUI。
Edit:从 isValidForm 函数调用中删除收集后,我能够获得响应,但现在它会出现多次。因此,我的 api 调用会执行多次。