Swift - 合并订阅未被调用

2024-03-02

最近,我尝试使用freshOS/网络 https://github.com/freshOS/Networking快捷的包裹。

我读了好几次自述文件,但无法让它与我一起工作。我正在尝试获取使用公共 API 服务的国家/地区列表,这就是我所做的:

Model

import Foundation
import Networking

struct CountryModel: Codable {
    let error: Bool
    let msg: String
    let data: [Country]
}

struct Country: Codable {
    let name: String
    let Iso3: String
}

extension Country: NetworkingJSONDecodable {}
extension CountryModel: NetworkingJSONDecodable {}

/* 
Output
{
     "error":false,
     "msg":"countries and ISO codes retrieved",
     "data":[
          {
               "name":"Afghanistan",
               "Iso2":"AF",
               "Iso3":"AFG"
          }
     ]
}
*/

视图控制器+ 打印(数据)callAPI()函数不打印

    override func viewDidLoad() {
        super.viewDidLoad()
        
        configureUI()
        callAPI()
        
    }

    fileprivate func configureUI() {
        title = "Choose Country"
        
        view.addSubview(tableView)
        tableView.delegate = self
        tableView.dataSource = self
        tableView.frame = view.bounds
    }

    fileprivate func callAPI() {
        let countriesService = CountriesApi()
        var cancellable = Set<AnyCancellable>()
        
        countriesService.countries().sink(receiveCompletion: { completion in
            switch completion {
            case .finished:
                print("finished") // not printing
                break
            case .failure(let error):
                print(error.localizedDescription)
            }
        }) { data in
            print(data) // not printing
            self.countriesData = data
        }.store(in: &cancellable)
    }

国家API()

struct CountriesApi: NetworkingService {
    
    let network = NetworkingClient(baseURL: "https://countriesnow.space/api/v0.1")
    
    // Create
    func create(country c: Country) -> AnyPublisher<Country, Error> {
        post("/countries/create", params: ["name" : c.name, "Iso3" : c.Iso3])
    }
    
    // Read
    func fetch(country c: Country) -> AnyPublisher<Country, Error> {
        get("/countries/\(c.Iso3)")
    }
    
    // Update
    func update(country c: Country) -> AnyPublisher<Country, Error> {
        put("/countries/\(c.Iso3)", params: ["name" : c.name, "Iso3" : c.Iso3])
    }
    
    // Delete
    func delete(country c: Country) -> AnyPublisher<Void, Error> {
        delete("/countries/\(c.Iso3)")
    }
    
    func countries() -> AnyPublisher<[CountryModel], Error> {
        get("/countries/iso")
    }
}

我希望有人能帮助我解决我所缺少的事情。


问题出在你的callAPI()函数,如果你将代码更改为:

    fileprivate func callAPI() {
        let countriesService = CountriesApi()
        var cancellable = Set<AnyCancellable>()
        
        countriesService.countries()
            .print("debugging")
            .sink(receiveCompletion: { completion in
                switch completion {
                case .finished:
                    print("finished") // not printing
                    break
                case .failure(let error):
                    print(error.localizedDescription)
                }
            }) { data in
                print(data) // not printing
                self.countriesData = data
            }.store(in: &cancellable)
    }

注意我刚刚添加了这一行print("debugging").

如果您运行该命令,您可以在控制台中看到您的订阅立即被取消。

调试:接收取消

为什么?因为您的“可取消”或“订阅”仅存在于您的函数范围内,因此,它会立即被释放。

您可以做的是将可取消设置添加为 ViewController 中的属性,如下所示:

final class ViewController: UIViewController {
    
    private var cancellable = Set<AnyCancellable>()
    
    fileprivate func callAPI() {
        // the code you had without the set
        let countriesService = CountriesApi()
        
        countriesService.countries().sink(receiveCompletion: { completion in
            switch completion {
            case .finished:
                print("finished") // not printing
                break
            case .failure(let error):
                print(error.localizedDescription)
            }
        }) { data in
            print(data) // not printing
            self.countriesData = data
        }.store(in: &cancellable)
    }
    
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Swift - 合并订阅未被调用 的相关文章

  • SwiftUI:如何让项目的拖放重新排序起作用?

    我有以下 SwiftUI 视图 struct ContentView View State var model Model var body some View ScrollView LazyVGrid columns columns sp
  • Swift UI 导出画布内容

    我有一个画布 用户可以在上面画东西 我想导出用户在画布上绘制的任何内容 并且我正在使用以下扩展从视图中获取图像 extension View func snapshot gt UIImage let controller UIHosting
  • SwiftUI 检测用户何时截取屏幕截图或屏幕录制

    On UIViewController我们可以轻松地将观察者添加到控制器 喜欢 class ViewController UIViewController override func viewDidLoad super viewDidLoa
  • 从软件查找服务返回无效结果

    我尝试通过 XCode 组织者提交 iOS 应用程序 但在身份验证后失败 组织者说 从软件查找服务返回的结果无效 我怎么解决这个问题 检查 iTunes Connect 中您的应用程序状态是否为 等待上传 您可以更改状态以按 准备上传二进制
  • 如何在亚马逊AWS上加载ena驱动程序?

    我正在尝试在 Ubuntu VM 上加载 ena 驱动程序 根据文档 我的虚拟机有vif低性能驱动程序 ubuntu ip 172 31 14 190 ethtool i eth0 driver vif version firmware v
  • Swift 1.2 可选外部变量?

    由于 Swift 无法访问编译变量 因此我创建了一个指向编译变量的 Objective C extern 变量 编译变量转换器 h extern NSString const NetworkApiBasicAuthUsername 编译变量
  • “EXC_BAD_ACCESS”与“分段错误”。两者实际上相同吗?

    在我的前几个虚拟应用程序 用于学习时练习 中 我遇到了很多EXC BAD ACCESS 这以某种方式告诉我错误访问是 您正在触摸 访问一个不应该的对象 因为它尚未分配或释放 或者只是您无权访问它 查看此示例代码 该代码存在访问错误问题 因为
  • UINavigationBar 滑开而不是留在原处

    我创建了演示项目来展示问题 我们在 UINavigationController 中有两个视图控制器 MainViewController这是根 class MainViewController UIViewController lazy
  • 重新组织链式可观察量

    我有一大块链接的 Rx 可观察量 当通过选择表视图行时会触发这些可观察量table rx modelSelected 我希望能够打破这个逻辑 因为我目前必须在flatMapLatest 因为这是流程的 第一步 感觉不对 我必须在后续执行更多
  • 更改 TFS 构建代理的身份

    我们有一个运行集成测试的 TFS 构建代理 其中一些测试会调用 Internet 上的 Web 服务 我们的网络使用代理与互联网通信 由于构建代理在网络服务上的身份下运行 并且网络服务的设置未配置为使用代理 因此测试失败 我该如何执行以下操
  • 如何在 NLog 中记录网络目标的异常

    我正在使用NLog http nlog project org日志框架 并尝试获取任何 UDP 记录器应用程序中显示的异常和堆栈跟踪信息 例如Sentinel http sentinel codeplex com and Log2控制台 h
  • 如何在 iOS 6 中强制 UIViewController 为纵向

    As the ShouldAutorotateToInterfaceOrientation在 iOS 6 中已弃用 我用它来强制特定视图仅肖像 在 iOS 6 中执行此操作的正确方法是什么 这仅适用于我的应用程序的一个区域 所有其他视图都可
  • UNTimeIntervalNotificationTrigger nextTriggerDate() 是否给出了错误的日期?

    我正在更新本地通知以与 iOS 10 配合使用 但遇到了一个问题 我认为 nextTrigger 函数返回的不是 满足触发条件的下一个日期 而是返回当前日期时间加上您最初设置 UNTimeInvervalNotificationTrigge
  • 在 Swift 中将时间数组从 24 小时转换为 12 小时

    我有一个像这样的数组 arrayTimes 16 00 16 30 17 00 17 30 18 00 18 30 我想将数组从 24 小时转换为 12 小时 这是我到目前为止所拥有的 它转换数组中的第一个数字 我遗漏了一些东西 但我无法解
  • 在 MLMediaLibrary 中加载媒体源时出错

    我在加载时遇到错误mediaSourcesMac OS X 中的属性 我正在尝试使用以下方法获取 Apple Photos 源MLMediaLibrary class 我的应用程序是沙盒的 并且具有图片文件夹的只读权限 我收到错误 MLMe
  • 在 iOS 上使用 MDCBottomNavigationBar 切换视图控制器

    我正在尝试创建一个使用 Material Design 库的底部导航功能的 iOS 应用程序 我可以获得带有底部导航栏的视图控制器来编译和显示 但我无法添加其他视图控制器并在单击不同选项卡时在它们之间切换 我将所有内容简化为两个文件 一个是
  • 如何找到安全区域的高度和宽度?

    我正在尝试以编程方式为某些标签 按钮和文本字段设置相对于安全区域的高度和宽度的约束 例如 我希望将标签到安全区域顶部的距离设置为安全区域高度的 10 如何检索安全区域的高度和宽度 这是一个合理的方法吗 我的想法是 无论 iOS 设备如何 我
  • 如何在没有 Apple 开发者帐户的设备上运行应用程序

    我找到了几个网站 其中提供了有关如何完成此操作的信息 但似乎没有一个网站适用于 Xcode 10 1 或 iOS 12 1 我尝试过的那些似乎都不起作用 我试过这个 创建一个空的 swift 项目 单视图应用程序 将签名团队设置为我的个人团
  • 快速不平衡调用开始/结束外观转换

    这已经困扰我一段时间了 我有一个UISplitViewController里面一个UITabBarController 主视图是一个TableView 当我单击一个单元格时 我会弹出一个非常基本的视图控制器 其中只有一个UIButton居中
  • iOS 图表错误:Thread1:EXC_BAD_ACCESS(代码=2,地址=0x2a0c220)

    因此 我正在遵循 AppCoda 上的 iOS Charts 教程 我完美地遵循了它 然后当我遇到问题时 我还复制了代码以使其完全匹配 问题是 当我尝试创建饼图然后运行它时 我收到错误 线程1 EXC BAD ACCESS 代码 2 地址

随机推荐

  • 设置为 Theme.NoTitleBar.Fullscreen 后应用程序崩溃

    如果我不取消标题栏 我的应用程序就会启动 但是当我取消标题栏时 它一启动就会崩溃 这是我到目前为止的代码 xml version 1 0 encoding utf 8 gt
  • 在 Angular 7 中使用 getElementById 在 DOM 元素上应用指令

    我有一些由第三方 plotly 生成的 HTML 我很想在它创建的 DOM 元素之一上应用我们已有的指令 该指令在单击时打开一个 colorPicker 并将颜色设置为字符串 我可以通过以下方式到达元素querySelector or ge
  • 英特尔 MKL 错误:参数 6 输入时不正确

    我收到以下错误 Intel MKL ERROR Parameter 6 was incorrect on entry to DGELSD 在 scipy 上运行 Savitzky Golay 过滤器时 函数scipy signal savg
  • 测试 IntegrityError UNIQUE 约束失败

    我对电子邮件和商店有一个 unique together 约束 我使用以下代码来测试唯一约束 我期望通过assertRaise 测试 但结果显示相反 我在这里缺少什么 from django db backends sqlite3 base
  • 散景,仅在单个轴上缩放,相应地调整另一个轴

    如何使散景仅在一个轴上使用缩放并自动缩放对象 以便它们精确地占据给定的空间 并在可缩放轴平行的极值点上添加一些填充 同时将空白空间渲染到范围之外 换句话说 准确地说是 疯狂技能 示例图 https i stack imgur com I3j
  • 仿函数调用和函数调用的详细区别?

    这样做的关键原因是 for each 实际上并没有假设它的第三个参数是一个函数 它只是假设它的第三个 论证是可以的 用适当的参数调用 A 适当定义的对象也可以 作为 而且往往比 更好 功能 例如 更容易 内联应用程序运算符 类而不是内联传递
  • 如何从 Visual Studio 中调试 IIS 上的两个 Web 应用程序/服务?

    在 Visual Studio 2010 中 我想同时调试在 IIS 上运行的两个 Web 应用程序 调试第一个应用程序时一切正常 但是当开始调试第二个应用程序且第一个程序仍处于调试模式时 Visual Studio 会提示 无法在 Web
  • 通过指定坐标检索 html 控件

    如何仅通过指定触发事件的坐标来获取 html 控件的 id 例如onmousedown onmouseup onclick ETC 坐标可以通过以下方式获得 e clientX e clientY其中 e 是事件对象 这个想法是获取在其上完
  • Chrome 不允许 cookie 过期时间少于 4 小时

    我似乎无法在 Google Chrome 中设置寿命较短的 cookie 它们要么没有被设置 要么立即被删除 无法分辨是哪一个 尽管两种方式的结果都是相同的 仅当未来到期时间为 4 小时或更短时 才会发生这种情况 如果过期时间大于 4 小时
  • 如何在 Extjs 4.1 中使用 treecombo

    我找到了导师http www sencha com forum showthread php 198856 Ext ux TreeCombo http www sencha com forum showthread php 198856 E
  • 验证一组对象是否已正确映射

    我正在寻找一套干净的管理方法测试特定的相等性 http blog ploeh dk 2012 06 22 Test specificEqualityversusDomainEquality in F 单元测试 90 的时间里 标准结构平等
  • 在哪里下载 MySQLdump.ext 比 mysqldump.exe 版本 5.7.1.7 更新的版本

    尝试通过 MySQL Workbench 转储简单数据库 方法是单击 服务器 gt 数据导出 gt mydb gt 开始导出 获取消息 mysqldump 版本不匹配 该消息显示这些版本 mysqldump exe 版本 5 7 1 7 M
  • 如何让我的 Yubikey 在 Windows 10 中与 SSH 配合使用?

    在出于技术兴趣购买了 Yubikey 5 NFC 固件 5 2 7 并尽可能设置 FIDO2 身份验证后 我遇到了无法再通过 SmartGit 连接到我的 GitLab 服务器的问题 因为没有请求第二个因素 因此我无法连接到服务器 然后我决
  • Neo4j gem - 处理管理关系的首选方法

    这主要是一个设计 效率问题 但我想看看在 Neo4j 中是否有一种首选方法来处理这个问题 而不是在 sql 数据库中如何处理 现在我有 2 个模型 user and event 我之间也有关系user and event表示他们将参加该活动
  • 在 groovy shell 中使用 groovy 类别

    我正在使用 Groovy 类别在一些 DSL 下工作 我想找到一种方法来使用我的 DSL 和 groovy shell 而无需显式编写use MyCategory myObject doSomething 对于每个命令 例如 假设我有以下玩
  • 使用 JPA 从表中删除所有行

    我想使用 JPA 删除特定表中的所有行 我做了什么 public class EmptyBomTables extends HttpServlet private static final long serialVersionUID 1L
  • 如何同步向mongo插入数据(Nodejs、Express)

    我在使用 node express 将数据插入 mongodb 时遇到问题 我的代码如下所示 router get data section sort function req res next Deleting old data alwa
  • Python3 openpyxl 将包含特定值的行中的数据复制到现有工作簿中的新工作表

    我正在尝试将其中包含特定值的行复制到新工作表中 在查看下面列出的参考资料时 我能够确定如何使用 ws append 进行复制 但这在脚本中无法正常运行 我想做的是迭代 wb 如果它具有特定值 则创建另一个工作表并将该行复制到该工作表 我将不
  • 在函数中使用 Config::set() 两次的方法

    我已经用谷歌搜索和 stackoverflowed 如果可以的话 来解决这个问题 但找不到足够简洁的答案 一些参考文献 Laravel 4 当使用 Config set 更改 auth model 时 Auth user 不起作用 http
  • Swift - 合并订阅未被调用

    最近 我尝试使用freshOS 网络 https github com freshOS Networking快捷的包裹 我读了好几次自述文件 但无法让它与我一起工作 我正在尝试获取使用公共 API 服务的国家 地区列表 这就是我所做的 Mo