我在 lrvViewModel.swift 中有这段代码
func getVerificationID (phoneNumber: String) -> Future<String?, Error> {
return Future<String?, Error> { promise in
PhoneAuthProvider.provider().verifyPhoneNumber(phoneNumber, uiDelegate: nil) { (verificationID, error) in
if let e = error {
promise(.failure(e))
return
}
print("verification worked")
self.defaults.set(verificationID, forKey: "authVerificationID")
return promise(.success(verificationID))
}
}
}
然后我在另一个文件中调用并订阅发布者,如下所示
let _ = lrvViewModel.getVerificationID(phoneNumber: (lrvViewController?.textField.text)!)
.sink(receiveCompletion: {
print("Error worked")
// does a bunch of stuff
}, receiveValue: {
print("completion worked")
// does a bunch of stuff
})
我没有收到任何构建时错误,但每当我运行应用程序时,GetVerificationID 函数都运行良好(打印“验证已工作”),但 .sink 中的代码不运行(我没有收到任何打印语句)。这是怎么回事?
Edit:
我的解决方案是放弃组合并返回 RXSwift,其中代码很简单:
var validateObs = PublishSubject<Any>()
func getVerificationID (phoneNumber: String) {
PhoneAuthProvider.provider().verifyPhoneNumber(phoneNumber, uiDelegate: nil) { (verificationID, error) in
if let e = error {
print("v error")
self.validateObs.onError(e)
return
}
self.defaults.set(verificationID, forKey: "authVerificationID")
self.validateObs.onCompleted()
}
}
and
lrvViewModel.getVerificationID(phoneNumber: (lrvViewController?.textField.text)!)
let _ = lrvViewModel.validateObs.subscribe(onError: {
let e = $0
print(e.localizedDescription)
// do stuff
}, onCompleted: {
// do stuff
})
希望不依赖依赖项,但 RxSwift 实现要容易得多。
如果有人知道组合未来问题的解决方案,请发帖!我还是想知道到底发生了什么。我很可能(而且很可能)只是使用了错误的组合。
Edit 2:
使用组合错误。我可以像这样复制 RXSwift 的代码:
let verifyPub = PassthroughSubject<Any, Error>()
func getVerificationID (phoneNumber: String) {
PhoneAuthProvider.provider().verifyPhoneNumber(phoneNumber, uiDelegate: nil) { (verificationID, error) in
if let e = error {
self.verifyPub.send(completion: .failure(e))
return
}
print("verification worked")
self.defaults.set(verificationID, forKey: "authVerificationID")
self.verifyPub.send(completion: .finished)
}
}
and
let subs = Set<AnyCancellable>()
let pub = lrvViewModel.verifyPub
.sink(receiveCompletion: { completion in
if case let .failure(error) = completion {
print("Error worked")
// do stuff
} else {
print("completion worked")
// do stuff
}
}, receiveValue: { _ in
print("this will never happen")
}).store(in: &subs)
我不明白,在组合中,接收器只有两个结果,完成或值,并且完成被分成多种情况。而在 RxSwift 中,有 OnNext、OnComplete 和 OnError。
向 raywenderlich.com 出版的《Combine》一书致敬。好东西。