.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 命令,所以管道在任何值有机会下降之前就已经不存在了。

您将管道分配给空 _ 有效地掩盖了这个问题。编译器试图警告您,您将其关闭。