Reactive Cocoa 5 和 ReactiveSwift 网络请求处理

2024-03-13

我试图弄清楚是否可以使用 ReactiveSwift 和 RAC5 来实现适合我需求的网络请求处理。

在主题下从 RACSignal 迁移到 ReactiveSwift 或 RAC5 https://stackoverflow.com/questions/43476727/migrate-from-racsignal-to-reactiveswift-or-rac5有人告诉我可以使用 SignalProducer 来完成,但深入研究并没有给我带来预期的结果

所以,我想要:
1. 每次textField中的文本发生变化时发送请求(通过关键字搜索)。
2.一旦用户关闭当前ViewController,当前请求应自动取消
3.一旦关键字更改就可以取消请求

这是我所拥有的

self.textField.reactive.continuousTextValues.skipNil().filter({ (value) -> Bool in
        return value.characters.count > 0
    }).observeValues { [unowned self] (value) in
        self.fetchSignalDisposable?.dispose()
        self.fetchSignal = self.producerFor(keyword: value).on(started: {
            print("started")
        }, failed: { (error) in
            print("error")
        }, completed: {
            print("completed")
        }, value: { [unowned self] (items) in
            print("value")
            self.items.append(contentsOf: items)
            self.tableView.reloadData()
        })
        self.fetchSignalDisposable = self.fetchSignal!.start()
    }

这是生产者初始化程序

return SignalProducer<Any, NSError> { (observer, disposable) in
        let task: URLSessionDataTask? = NetworkClient.fetchRequestWith(uri: "test", parameters: ["keyword" : keyword], success: { response in
            observer.send(value: response)
            observer.sendCompleted()
        }, failure: { error in
            observer.send(error: error)
            observer.sendCompleted()
        })
        disposable += {
            task?.cancel()
        }
    }

Notes:
1.有时我想要有一种“两个处理程序块”,在成功和错误时都会被调用,因此可以在该块下完成诸如隐藏加载指示器之类的事情。

这里有几个问题/疑问:
1. 一旦我关闭 VC(关闭操作),observeValue 处理程序就会再次被调用。可以通过添加来修复.skipRepeats(),但我想这只是一个解决方法,而不是一个确切的解决方案。如果我关闭 VC,我不想再让这个观察者处于活动状态
2. completed发生错误时不会调用块,即使我在调用后立即手动调用它send(error: error)
3.如果请求仍在加载并且我关闭了VC,则它不会被处理自动地,这对我来说看起来很奇怪。我认为一旦 viewController 失去对 signalProducer 的引用,dispose 块就会被自动调用。甚至打电话self.fetchSignalDisposable?.dispose() in deinitVC 的方法不会取消请求。它仍然完成请求并调用value导致崩溃并出现错误访问错误的处理程序

我个人的需求是:
1. 有某种“两者”块,在请求成功和失败后都会调用
2. 一旦我关闭 VC,文本字段文本值的所有观察者都必须被删除并且不再处于活动状态
3.关闭VC时必须立即取消网络请求

P.S.:当然,感谢所有阅读这篇长文并花时间帮助我的人!


“发出网络请求”示例来自ReactiveSwift 自述文件 https://github.com/ReactiveCocoa/ReactiveSwift就是此类事情的一个很好的例子。而不是使用observeValues在您的文本字段信号上,通常您会使用.flatMap(.latest)像这样将其直接连接到您的 SignalProducer (请注意,我还没有检查此代码,但希望它能传达这个想法):

self.textField.reactive.continuousTextValues
    .skipNil()
    .filter { (value) -> Bool in
        return value.characters.count > 0
    }
    .flatMap(.latest) { [unowned self] value in
        return self.producerFor(keyword: value)
            // Handling the error here prevents errors from terminating
            // the outer signal. Now a request can fail while allowing
            // subsequent requests to continue.
            .flatMapError { error in
                print("Network error occurred: \(error)")
                return SignalProducer.empty
            }
    }
    .observe(on: UIScheduler())
    .observe { [unowned self] event in
        switch event {
        case let .value(items):
            print("value")
            self.items.append(contentsOf: items)
            self.tableView.reloadData()

        case let .failed(error):
            print("error")

        case .completed, .interrupted:
            print("completed")
        }
    }

指定.latest导致新请求启动时,前一个网络请求会自动取消,因此无需在全局变量中跟踪当前请求。

至于管理生命周期,在不了解更广泛的代码结构的情况下很难说出最好的事情是什么。通常我会添加类似的东西.take(during: self.reactive.lifetime)当我发出终止订阅的信号时self被释放,可能就在调用之前observe.

错误事件终止信号。发生错误后无需发送已完成的事件,并且观察者无论如何也看不到它。基本上,完整表示信号成功终止,而错误表示信号失败终止。

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

Reactive Cocoa 5 和 ReactiveSwift 网络请求处理 的相关文章

  • 应用程序图标未刷新

    我更改了新版本应用程序中的图标图像 并且我在设备中安装了旧版本应用程序 然后我安装了新版本 它在 iOS 5 中运行良好 但在 iOS 6 中 图标没有刷新 它仍然显示旧版本图标 徽标 如果没有安装旧版本应用程序 该设备在 iOS 5 和
  • 从 Plist 中存储和检索 [重复]

    这个问题在这里已经有答案了 可能的重复 iOS 在 plist 文件中存储两个 NSMutableArray https stackoverflow com questions 6070568 ios store two nsmutable
  • Swift 数组设置索引值不起作用

    我有一个方法 下面的内容 其中queue2只是一个 Int 我打印了很多东西 看看一切是否都正常 public func cool item Int println item println back queue2 insert item
  • iOS Swift 检测键盘事件

    我能以某种方式检测来自 iOS 键盘的事件吗 我想检测此类事件UIViewController哪个没有UITextField或任何此类物体 我只有四个圆圈UIView我想在按下键盘上的按钮时将它们涂成不同的颜色 您没有任何对象可以从键盘获取
  • 新的 FUITableViewDataSource - 如何使用?雨燕3

    刚刚更新到较新的 FirebaseUI Pod 有些事情发生了变化 但其中最大的变化之一是 FUI 表视图的工作方式 我让它在旧版本上运行良好 但在下面遇到了困难 并且缺乏文档 示例 self dataSource FUITableView
  • 使用隐藏的 SFSafariViewController 获取 Safari cookie

    我正在阅读以下关于从移动网页到本机 iOS 9 应用程序对用户进行身份验证的文章 并且想知道如何最好地实现类似于下面讨论的隐藏控制器的隐藏 safari 视图控制器 https library launchkit io how ios 9
  • iOS:从非图像数据生成图像(Godus,如风景)

    所以看到图像后Godus http www kickstarter com projects 22cans project godus我想知道如何生成简单的 非交互式的 2D 图像 with 不同高度或层数的颜色不同就像下面的图片一样 我只
  • 尝试从独立的 Apple Watch 应用发出网络请求

    当应用程序是独立应用程序时 Apple Watch 是否无法进行网络通话 即使手表已连接到 iPhone 我正在使用新的独立应用程序目标 它没有附带可以发出 WatchConnectivity 请求的配对 iOS 应用程序 我十有八九收到
  • Swift 对异步编程有什么语言级别的支持(如果有)?

    当应用程序必须通过不可预测的网络 例如智能手机应用程序 进行通信时 异步编程对于响应式用户界面来说是必须的 用户界面必须保持响应 同时等待结果从互联网上某处的服务器返回 在大多数语言中 应用程序程序员必须实现自己的状态机 可能使用闭包 来响
  • UIBezierPath 的起始和结束角度?

    我在 iOS 中使用如下代码编写了半圆UI贝塞尔路径 and CAShape层 clockWiseLayer CAShapeLayer alloc init CGFloat startAngle M PI 2 CGFloat endAngl
  • iOS 中的等宽字体是什么?

    我想要在我的 iOS 应用程序中为 UILabel 使用等宽字体 不幸的是 我找不到一个 甚至 美国打字机 实际上也不是等宽的 XCode 中可用的等宽字体是什么 iOS 等宽字体 Courier Courier Bold Courier
  • iPad 3 中配备 Xcode 4.2 和 Retina 的 iOS 5.1

    我有一台装有 Mac OS X Snow Leopard 的 Mac 我可以添加 iOS 5 1 吗 使用 iPad 3 的新分辨率 我们将如何处理图像 因为如果该应用程序将在 iPhone 3GS 4 和 iPad 3 中运行 我认为我们
  • 在 Swift 中检查一个数组是否包含另一个数组的所有元素

    我想为数组编写一个扩展来检查一个数组是否包含另一个数组的所有元素 在我的用例中它是字符串对象 但我一直得到 Cannot convert value of type T Generator Element to expected argum
  • 在模拟器中运行应用程序时删除本地通知的 iOS 权限警报

    我正在尝试编写验收测试KIF https github com kif framework KIF在一个很早就要求本地通知权限的应用程序上 不幸的是 由于 iOS 模拟器安全原因无法使用 KIF 自动接受 iOS 权限警报 https gi
  • 如果 NSExtensionActivationRule 设置为仅音频,则共享扩展不会出现在有功能的应用程序中

    我正在尝试创建一个共享扩展 用户可以从任何有能力的应用程序上传她的录音 该文档甚至有一个简单的示例 请参阅声明共享或操作扩展支持的数据类型 https developer apple com library content document
  • Cognito/IAM 策略和 S3 获取对象

    我正在尝试将 S3 和 Cognito 集成到我的 iOS 应用程序中 但到目前为止尚未成功 我相信该错误与我针对 Auth 和 Unauth 用户的 IAM 策略有关 所以这是我的政策 Version 2012 10 17 Stateme
  • iOS 对 Google 云消息传递的支持

    我在谷歌的开发者控制台中看到 GCM 允许为 iOS 生成 API 密钥 我在网上搜索了有关如何在 iOS 应用程序中通过 GCM 实现推送通知的任何类型的文档 但没有找到答案 真的有可能在 iOS 应用程序中使用 GCM 实现推送通知 j
  • Parse - 使用 Swift 进行子类化?

    我正在尝试让标准子类与 swift 一起使用 桥接标头 h import
  • 下标:使用字符串枚举访问我的字典值

    我想做类似的事情 使用字符串枚举访问我的字典值 我试图重载字典的下标但没有成功 访问字典 let district address JsonKeys district 其中 JsonKeys 是 enum JsonKeys String c
  • 当设置 setVisibleXRangeMaximum 时,iOS-Charts X 轴值无限重复

    我正在尝试绘制一个图表 其中 x 轴是TimeIntervalY 轴是power consumption 由于每天都会有数据 因此将有太多数据无法显示 因此 我想一次显示 5 个值 我通过设置实现了这一点self chart setVisi

随机推荐

  • git 和 CR 与 LF(但不是 CRLF)

    这听起来像是一个多余的问题 而且很可能是一个多余的问题 但我找不到答案 情况是这样的 我的应用程序正在创建以 CR 作为行结尾的文本文件 更具体地说 我没有明确地将行结尾设置为 CR 它恰好是我用来获取文本正文的命令的输出 当然 我可以手动
  • 使用 ExecutorService 执行异步任务时出现问题

    我曾问过一个问题earlier https stackoverflow com questions 8668839 java velocity engine initialization issue关于 ExecutorService 和
  • 在 C#/.NET3.5 中构造动态 SQL 查询的最佳方法?

    我目前正在进行的一个项目涉及重构 C Com 对象 该对象充当某些 Sql 2005 数据库的数据库访问层 现有代码的作者使用字符串和许多 if 语句手动构建了所有 sql 查询 以构造相当复杂的 sql 语句 约 10 个连接 gt 10
  • 如何将 spring mvc 应用程序打包到 jar 中?

    我有一个使用构建的应用程序maven and spring mvc and tomcat7 maven plugin 我可以将它们打包成一个jar文件 以便我可以运行该jar文件来启动tomcat服务器吗 这意味着我不需要tomcat 只需
  • 将多个工作表中的 Excel 数据复制到一张工作表中

    我尝试在互联网上搜索这个问题的各种答案 但找不到正确的答案 我有一个 Excel 工作簿 其中的工作表代表该月的每一天 每张表的格式都是相同的 周六和周日除外 并且包含通话统计信息 它以以下格式呈现 00 00 00 300 4 6 3 4
  • 为什么authenticate() 对非活动用户返回 None ?

    I have CustomUser像下面这样 class CustomUser AbstractBaseUser PermissionsMixin email models EmailField max length 100 unique
  • 让 Django 以“不同的文件名”返回响应

    我有一个 Django 视图 它返回一个HttpResponse使用特殊的 MIME 类型使用户的浏览器 下载 文件而不是在浏览器中查看它 问题在于 保存响应的默认文件名是用户尝试访问的 URL 有没有办法在文件中包含默认文件名HttpRe
  • SWIG:%import 和 %include 之间的区别

    The SWIG 文档 http www swig org Doc2 0 Preprocessor html这两个指令解释如下 include 要将另一个文件包含到 SWIG 界面中 请使用 include指令 不同的是 include i
  • LINQ to NHibernate - .GroupBy().Skip().Take() 导致异常

    NHibernate 版本 3 3 1 4000 Query IQueryable
  • 想要测试空手道 API 中整数值应 >3 的断言

    json 响应是 值 0 23 我想在这里放置断言值应该小于 3 那么如何做到这一点 尝试了文档中的一些示例 但它们适用于此处的 jsonenter 代码的数组格式 场景 显示任何向 CS 发出 DB 请求所需的最短时间 该值是数据库访问性
  • Gem::installerror:“json”本机 gem 需要安装构建工具。请更新我们的路径以包含构建工具

    我使用 Railsinstaller 安装 Rails 但仍然收到此错误消息 基于与此相关的其他问题 看来 Railsinstaller 应该包含 devkit 并且这个问题不应该发生 我做错了什么 顺便说一句 这是当我更改 gemfile
  • 实体框架上下文应该放入using语句中吗?

    实体框架上下文对象实现 Dispose 方法 该方法 释放对象上下文使用的资源 它到底有什么作用 总是将其放入 using 语句中会是一件坏事吗 我见过它在有或没有 using 语句的情况下使用 我具体将在 WCF 服务方法中使用 EF 上
  • 中断boost::asio同步读取?

    我正在使用 asio 同步套接字通过 TCP 从后台线程读取数据 这被封装在 服务器 类中 但是 我希望线程在调用此类的析构函数时退出 问题是对任何读取函数的调用都会阻塞 因此线程不能轻易终止 Win32 中有一个 API 可以实现这一点
  • 鼠标仅悬停在文本上而不是整行上

    如何仅在文本而不是整行上提供鼠标悬停效果 我尝试使用 Position 但结果为空 下面是小提琴链接 ul li Task1 li li Task2 li li Task3 li li Task4 li li Task5 li li Tas
  • Eclipse + Tomcat - 直接从工作区提供 Web 应用程序

    将 Tomcat 配置为直接从工作区中的项目目录提供服务的理想方法是什么 related https stackoverflow com a 6378629 292614 我想要我的静态网络资源每当我对它们进行更改时即可立即可用 而无需将它
  • 设置一堆简短/友好的重定向 URL

    我需要设置数百个遵循以下格式的短重定向 URL http mysite com shorturl 这将重定向到 http mysite com index php id N 其中 N 是与该快捷方式对应的 ID 执行此操作的最佳方法是什么
  • 查找字符和数字之间可能的双射

    假设您有一个字符串 S 和列表 L 中的一个数字序列 使得 len S len L 检查是否可以找到字符串的字符与序列中的数字之间的双射以使每个字符与一个且仅一个数字匹配的最干净的方法是什么 例如 aabbcc 应与 115522 匹配 但
  • 为动态创建的 HTML 元素创建事件监听器

    在 downMouseBtn event 事件处理程序中 我创建了元素 div 我需要为创建的项目创建一个事件监听器 我怎样才能创建这个 添加哪部分代码呢 我需要处理动态生成的项目的 mouseClick 事件 import Compone
  • 字符串中回文子序列的总数

    问题是这样的 对于作为输入给出的每个字符串 您需要告诉它的回文子序列的数量 不一定是不同的 请注意 空字符串不是回文 例如 aab 的回文子序列是 a a b aa 该方法返回 4 我心中有寻找最长回文子序列的动态规划解决方案 因此尝试从中
  • Reactive Cocoa 5 和 ReactiveSwift 网络请求处理

    我试图弄清楚是否可以使用 ReactiveSwift 和 RAC5 来实现适合我需求的网络请求处理 在主题下从 RACSignal 迁移到 ReactiveSwift 或 RAC5 https stackoverflow com quest