.sink 没有从未来发布者返回承诺值

2024-01-20

我在 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》一书致敬。好东西。


发生了什么事是你的.sink后面没有一个.store命令,因此在任何值有机会通过管道之前管道就会消失。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

.sink 没有从未来发布者返回承诺值 的相关文章

  • IOS Coredata 兼容 IOS 9 和 ios 10

    您好 我正在开发一个适用于 IOS 10 和 9 xcode 8 的应用程序 创建新实体对象的正确方法是什么 新的IOS 10有这个代码 var newEvent Event context context 我们如何让这段代码同时适用于 I
  • 在 iOS 上的 SceneKit 中导入 3d 模型

    从 URL 导入 obj 文件并将其转换为 SCNNode 时遇到问题 这是代码 swift3 let url URL init string https cloud box com shared static ock9d81kakj91d
  • Xcode 9.0.1 应用程序分发程序已更改

    最近我将 Xcode 升级到了 Xcode 9 1 之后 当我尝试发布我的应用程序时 Xcode 不允许选择我为临时创建的分发配置文件 这么说 配置文件不是 IOS 应用商店配置文件 如果 Xcode 9 1 的应用程序分发过程有变化 请告
  • 如何在 SwiftUI 中呈现视图而不将其嵌入到当前导航流中?

    我已经完成了日志记录入门 并且需要呈现一个 HomeView 它对之前的导航流程一无所知 var body some View if viewModel isValidated destination else LoadingView 通过
  • RxSwift、RxCocoa 和 UITableview

    我在使用 RxSwift 实现 UITableView 时遇到问题 我尝试使用以下代码将模型数组的可观察对象绑定到表项 models bind to self tableView rx items cellIdentifier Cell c
  • Swift 中不再有“private init”?

    我看到很多关于使用的参考private init在 Swift 中限制对象构造 例如this http krakendev io blog the right way to write a singleton 但当我尝试时 在 Xcode
  • 我正在寻找 GCDAsyncUdpSocket 上的一些示例,但发现没有一个有效

    接收数据从未被调用过 我编写了这个由我的主线调用的 swift 类UI视图控制器向接收消息的服务器发送消息 但当服务器发回响应时 客户端永远不会收到它 因为 didReceiveData 从未被触发 我一直在谷歌上搜索并查看文档 它说客户端
  • iOS 上的本地通知需要用户许可吗?

    我在我的应用程序中使用 UILocalNotification 来安排通知 通知工作正常 并在我需要时显示 我对此没有意见 我没有做任何远程 推送通知 让我想知道的是 我从未见过您通常在多个应用程序中看到的推送通知的著名权限对话框 我什至重
  • NSUserDefaults、Settings.bundle 和应用程序组

    我有一个有 2 个目标的应用程序 主应用程序和 Today 扩展 为了在这些目标之间共享设置 我打开了应用程序组功能 添加了一个组group myApp com然后使用NSUserDefaults在主应用程序和今日扩展中都是如此 var d
  • 在 swift 中使用自定义字体[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我需要一个用于 swift sprite kit iOS 的字体 该字体用于商业目的 我正在尝试拥有一
  • 使用 AVAssetExportSession 导出延时会导致黑色视频

    我需要能够合并使用 iOS 上的相机应用程序中的延时拍摄功能拍摄的视频并导出为单个视频 但是 即使我尝试将单个未更改的延时视频导出到照片库 它也会保存为全黑视频 具有正确的持续时间 以下是我编写的示例代码 用于导出单个未更改的视频 其中大部
  • UIAlertController 显示延迟

    我在我的应用程序上遇到了 UIAlertController 问题 现已迁移到 iOS8 其中包含日期选择器 下面是代码 UIAlertController AlertView UIAlertController alertControll
  • iOS 版有 Parse.com 的替代品吗? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我目前使用 parse com 来管理用户 他们有很棒的 AP I 有不错的后端供我管理东西 但我更愿意托管我自己的数据 服务器后端 我可
  • Xcode - 配置:错误:在 $PATH 中找不到可接受的 C 编译器

    从头开始重建 Mac 安装了 xcode 和 rvm 然后尝试安装 rubies 但它们都给了我 Error running configure prefix Users durrantm rvm rubies ruby 1 9 3 p12
  • 如何清理 Xcode 5 中的构建文件夹?

    Xcode 5 中 清理构建文件夹 的快捷方式似乎消失了 Command Option Shift K 不再起作用 有人找到新的快捷方式了吗 从 Xcode 7 开始 此功能又回来了 按Command Option Shift K 或者从菜
  • Xcode 4.2 中“未找到有效签名身份”

    我知道还有其他问题与此非常相似 但他们的症状与我的不太一样 我有一个应用程序 我一直在尝试提交到应用程序商店 我正在运行 Xcode 3 2 6 并且不断收到来自 iTunes Connect 的无效二进制错误 我最终找到了一个指向升级 X
  • 自定义过渡动画在animationControllerForPresentedController和animateTransition之间未知延迟

    我的目标是使动画在第一个视图控制器中开始并在第二个视图控制器中结束 我正在尝试使用符合以下条件的对象进行过渡动画UIViewControllerAnimatedTransitioning and UIViewControllerTransi
  • Mac-catalyst - Mac Catalyst 应用程序的最小窗口大小

    Mac Catalyst 允许调整窗口大小 有什么方法可以为 Mac Catalyst 应用程序提供最小窗口大小 只需将以下代码块添加到您的application didFinishLaunchingWithOptions方法 对于UIKi
  • 在哪里可以了解有关 WebCoreSharedBufferData 的更多信息?

    我有一个在 iOS 6 上完美运行的应用程序 但在 iOS 7 上 如果用户采取了非常具体的操作 太复杂而无法进入 但它使用UIWebView并且它是一致的 应用程序崩溃并出现错误 Terminating app due to uncaug
  • UITableView 干扰状态栏

    我正在开发一个具有 UITableViewController 的应用程序 该应用程序显示值列表 如下所示 如何将表格向下移动 使其不会与状态栏冲突 看来我无法对这个场景施加任何限制 所以我不知所措 使用以下 3 个属性UIViewCont

随机推荐