.sink 没有从 Future Publisher 返回承诺值
.sink is not returning the promise values from a Future Publisher
我在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 函数 运行 没问题(打印 "Verification worked"),但是 .sink 中的代码没有't 运行 (我没有得到任何打印语句)。怎么回事?
编辑:
我的解决方案是放弃 combine 并回到 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()
}
}
和
lrvViewModel.getVerificationID(phoneNumber: (lrvViewController?.textField.text)!)
let _ = lrvViewModel.validateObs.subscribe(onError: {
let e = [=13=]
print(e.localizedDescription)
// do stuff
}, onCompleted: {
// do stuff
})
希望不依赖依赖项,但 RxSwift 的实现要容易得多。
如果有人知道 Combine Future 问题的解决方案,请 post!我仍然想知道 wtf 正在发生。很有可能(而且很可能)我只是错误地使用了 combine。
编辑 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)
}
}
和
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)
我不明白在 combine 中只有两个结果到一个接收器,一个完成或一个值,并且完成被分成多个案例。而在 RxSwift 中,你有 OnNext、OnComplete 和 OnError。
对 raywanderlich.com 关于 Combine 的书的推荐。好东西。
这是怎么回事,你的 .sink
后面没有跟 .store
命令,所以管道在任何值有机会下降之前就已经不存在了。
您将管道分配给空 _
有效地掩盖了这个问题。编译器试图警告您,您将其关闭。
我在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 函数 运行 没问题(打印 "Verification worked"),但是 .sink 中的代码没有't 运行 (我没有得到任何打印语句)。怎么回事?
编辑:
我的解决方案是放弃 combine 并回到 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()
}
}
和
lrvViewModel.getVerificationID(phoneNumber: (lrvViewController?.textField.text)!)
let _ = lrvViewModel.validateObs.subscribe(onError: {
let e = [=13=]
print(e.localizedDescription)
// do stuff
}, onCompleted: {
// do stuff
})
希望不依赖依赖项,但 RxSwift 的实现要容易得多。
如果有人知道 Combine Future 问题的解决方案,请 post!我仍然想知道 wtf 正在发生。很有可能(而且很可能)我只是错误地使用了 combine。
编辑 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)
}
}
和
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)
我不明白在 combine 中只有两个结果到一个接收器,一个完成或一个值,并且完成被分成多个案例。而在 RxSwift 中,你有 OnNext、OnComplete 和 OnError。
对 raywanderlich.com 关于 Combine 的书的推荐。好东西。
这是怎么回事,你的 .sink
后面没有跟 .store
命令,所以管道在任何值有机会下降之前就已经不存在了。
您将管道分配给空 _
有效地掩盖了这个问题。编译器试图警告您,您将其关闭。