Tag: 响应

实现RxSwift与Swift委托

委托是一种常用的设计模式,它允许一个对象通过协议将工作移交给另一个对象(可能是不同类型)。 另一方面, 反应式编程围绕应用程序生态系统中变化的扩散而进行的数据流和传输。 这是通过观察者,可观察对象和调度程序完成的,观察者在调度程序告诉它们运行的​​线程上寻找可观察对象的发射。 James Rochabrun的文章“在Swift中逐步实现委托”是我阅读的关于委托的第一篇文章之一。 这是一个使用两个视图控制器A和B的简单应用程序。视图控制器A符合视图控制器B的委托协议,其中视图控制器B告诉A显示用户选择的颜色。 我将使用James的委托示例与使用响应式编程(RxSwift)的相同实现进行比较。 // 1 覆盖func prepare(对于segue:UIStoryboardSegue,发件人:任何?){如果让nav = segue.destination为? UINavigationController,让viewControllerB = nav.topViewController为? ViewControllerB {// 2 viewControllerB.delegate = self}} // 3 func changeBackgroundColor(_ color:UIColor?){view.backgroundColor = color} 此代码块在ViewControllerA.swift 。 //1当用户单击“显示视图控制器B”时,将调用该代码以准备该序列。 //2由于在此代码块中有对ViewControllerB的引用,因此我们将B的委托变量分配给self ,即ViewControllerA 。 协议ViewControllerBDelegate:类{ func changeBackgroundColor(_ color:UIColor?)} 接下来,在ViewControllerB.swift文件中,声明ViewControllerB.swift的协议,该协议包含更改View Controller A中背景颜色的功能。 // 1 弱var委托:ViewControllerBDelegate?// 2 @objc func handleTap(_ tapGesture:UITapGestureRecognizer){// 3 view.backgroundColor = tapGesture.view?.backgroundColor […]

RxSwift变得简单:第1部分—入门

欢迎阅读我关于RxSwift的系列文章中的第一篇。 如果您有兴趣学习反应式方法并将其应用于iOS项目,那么您会很幸运! 本系列将通过越来越复杂的功能进行介绍,并说明它们在代码中的实际应用。 让我们开始吧! 响应式编程已经存在了将近20年,但实际上仅在最近十年才引起关注。 为了使响应式编程能够在多个平台上使用,已经对最流行的编程语言进行了扩展。 前缀Rx(在RxSwift中可以看到)表示“反应性扩展”。 关于扩展的重要知识是,所有语言的底层方法都完全相同。 出于很多原因,这很酷,但立即想到的三个是: 您可以使用本机平台和语言来采用反应式编程方法。 您可以轻松地跨语言和平台进行协作。 一旦学习了一种语言的反应式编程,就可以将该知识直接转移到具有反应式扩展的任何其他语言。 听起来很有前途。 那是什么 响应式编程是一种处理异步数据序列的方法。 也就是说,向观察者发出事件的元素的可观察序列。 开始进行反应式编程可能有点吓人,因此在下一节中,我们将布局用于创建和观察序列的阶段,然后解释每个阶段的重要术语和概念。 让我们设置一个基本的可观察序列,然后对每个步骤进行解释:

转换运算符:地图,flatMap和flatMapLatest

RxSwift提供了一系列运算符,它们可以极大地控制您要如何处理应用程序中的数据和事件。 当您要对来自序列的数据进行建模以适合您的需求时,可以使用转换运算符。 换句话说,准备数据以符合订户的要求。 例如,要转换从Observable序列发出的元素,可以使用map运算符; 当元素从源Observable序列发出时,map将对其进行变换。 这类似于标准Swift库中的map(_ 🙂方法,不同之处在于此地图可用于Observable序列元素。 地图运算符的大理石图表示将如下所示: 实际地图(_ 🙂 我们将举一个在操场上使用地图的例子。 我们将需要我们的辅助函数,即executeProcedure(with description:String,procedure:()-> Void) 。 此函数有两个参数:字符串描述和过程闭包。 然后打印说明,然后执行该过程。 公共函数executeProcedure(用于描述:字符串,过程:()->无效){ print(“执行程序:”,描述) 程序() } 现在,我们将使用of运算符创建一个Observable整数序列: executeProcedure(for:“ map”){ Observable.of(10,20,30) } 然后,我们将使用map运算符将每个整数元素自身相乘: Observable.of(10,20,30) .map {$ 0 * $ 0} 然后,我们将订阅onNext来打印每个转换后的元素: Observable.of(10,20,30) .map {$ 0 * $ 0} .subscribe(onNext:{ 打印($ 0) }) 之后,我们对subscribe(onNext 🙂的返回值调用dispose() 。 请记住,订阅将返回Disposable 。 该函数的总体代码如下: executeProcedure(for:“ map”){ Observable.of(10,20,30) […]

通过实现Observable学习Rx

从我的角度来看,如果您是软件开发人员,则有几种学习新技术的方法: 阅读有关它 玩吧 破解或实施类似的东西 网上有很多例子说明了前两个例子,但很少有例子说明如何实现Rx。 因此,让我们看一下Rx核心原语的接口: 可观察的: 根据Observable的文档界面非常简单: 好吧,这很酷! 但是Rx的强大功能也在运算符中……因此,让我们实现map运算符: 与Rx中数组映射的映射相同,通过应用transform函数来transform序列的每个元素并返回新序列 回顾一下: Observable —是一种类型,您可以在其中通过调用subscription()传递一个Observer (基本上是一个回调)。 如您所见,所有魔术都发生在订阅方法中。 这就是使Rx如此强大的原因,您可以转换序列并传递Observable实例,而不必担心会发生什么事情 结论: 确保这是天真的,还没有准备好进行生产。 但是我真的希望它表明Rx背后没有魔力! 这里有游乐场 从这往哪儿走: RxSwift回购 ReactiveX网站 雷·温德利奇团队的RxSwift书 Rx背后的数学

RxSwift —主题

在RxSwift中潜水时,您需要概述主题。 那么什么是主题? 主体既充当可观察者又充当观察者。 他们可以接收事件,也可以订阅。 主题接收到.next事件,并且每次接收到事件时,它都会转身并将其发送给其订户。 RxSwift中有4种主题类型: • PublishSubject :开始为空,仅向订阅者发出新元素。 • BehaviorSubject :从初始值开始,然后将其或最新元素重放给新订户。 • ReplaySubject :使用缓冲区大小初始化,并将维护一个达到该大小的元素缓冲区并重播给新订户。 • 变量 :包装BehaviorSubject,将其当前值保留为状态,并仅将最新/初始值重放给新订户。 本部分重点介绍PublishSubject 一张图片胜过千言万语 第一个订阅者在1之后订阅,因此没有收到该事件,它接收2和3。第二个订阅者在2之后订阅,因此它仅接收3。 练习一万字 (😀) 假设我们有一个String类型的PublishSubject 让主题= PublishSubject () 尝试发出事件: subject.onNext(“没有事件发出吗?”) 什么都没打印出来? 是的,因为没有关于此主题的订阅。 让我们创建一个订阅: let subscriptionOne = subject .subscribe(onNext:{ 打印 字符串 (“ First Subscription:”,字符串) }) 现在使用主题发射物品 subject.onNext(“ 1”) subject.onNext(“ 2”) 肯定地,输出打印出1和2。 现在,让我们创建另一个订阅: let subscriptionTwo = subject .subscribe({ […]

iOS中的反应式编程?

React Native!=反应式编程 หลายๆคนเห็นแล้วอาจจะสับสนเข้าใจผิดว่ามันคือตัวเดียวกันจริงๆมันแค่ชื่อคล้ายกันเฉยๆนะ React Native本地 JavaScript代码库本地Facebook社区2013本地库开发人员Applicationาสารถพัฒนา应用程序android和iOS平台ได้ด้วยการเขียน代码Codeยเพีรั้งเดียว! ApplicationรียแบบาการพัฒนาApplicationแบบHybridก็ได้องใช้ภาษาที่ผูกติดกับPlatformใดPlatformหนึ่งนนiOSก็จะใช้Swift / Objective-CงางAndroidจะใช้Kotlin / Java 响应式编程异步编程概念กันอางหนึ่งที่วันนนราจะมาอธิบายConcept 响应式จะนReอะไรกัน? 反应堆activeายถึง“ซึ่งการตอตนอง”ตัวอย่างเช่นเราเอนเล่นๆสแครชไปสแครชมาเป็นDJแน่นอนเพื่อนคงไม่ให้เราถูหัวเล่นอยู่อย่า่นั้นใช่ปะใช่ปะองมีสวนกัน มีActงแหละActก็จะมีReact 文本字段(Act)文本字段 “ค่าเปลี่ยนแล้วววววววววววว”(反应)…ทำนองนั้นภาษาทางเทคนิคเรียกว่าEmitถ้าเราพิมพ์“ Hello”ออกไปมันก็จะEmitหลังจากที่เราเคาะแป้นแต่ละที “ H”→发射 “他”→发射 “ Hel”→发射 “地狱”→发射 “你好”→发射 ถ้ามีคนตะโกนพูดก็ต้องมีคนฟังว่าไหม? ะาพูดคนเดียวนี่เหมือนคนบ้านะ55 订户/观察者ในที่นี้ยกตัวอย่างเป็น表视图ส่วนเส้นๆที่เห็นนั้นเนเรียก可观察的顺序 Textรั้งที่ค่าใน文本字段เปลี่ยน表视图จะรู้เสมอเพราะคอย观察อยู่👀ากนั้นจะเอาอักษรแต่ละตัวมาแสดงหรืออื่นๆก็แล้วแต่เราจะเขียนโปรแกรม จะมีนิดนึงคือจะมี订户มารอฟังกี่ตัวก็ได้และ可观察的ไม่จำเป็นต้องเป็นUIอย่างเดียวจะเป็นตัวแปรหรืออย่างอื่นก็ได้นะะ iOSนที่เขียนiOSมาบ้างแล้วอาจจะสงสัยว่าจริงๆแล้ว异步编程ในiOSก็ใช้กันปกติอยู่แล้วเช่น 大中央派遣 通知中心 关闭 委托模式 响应式编程เพิ่มหละ? ที่AppleมีAPIใSDKให้ใช้หลตัวซึ่งช่วตัวซึ่งช่วตัวซึ่งช่วก็มีวิธีกออไม่มีแต่งกลับกัไม่มีไม่มีเขีไม่มีไม่มีไม่มีไม่มี ใจรือการทำความเข้าใจ代码 表格检视 步骤การ实现ของTableView 设置“代理”ให้กับTableViewทำให้TableViewมันรู้ว่าถ้าจะโชว์数据ต้องไปถามใครว่า数据มีกี่แถวแต่ละแถวเป็นยังไง…ฯลฯ 采用“ Protocol”协议,TableView和协议2协议。 功能ที่ใช้returnจำนวนCell 函数ที่ใช้returnข้อมูลของแต่ละCell 5.在TableView中,使用Reload编程(Reactive编程)。 แหละ55) 载入中… งาดูตัวอย่าง异步อีกอันบ้างเกี่ยวกับการโหลดข้อมูล 步骤การ工具ของ加载东西 มี功能ที่ใช้จัดการเกี่ยวกับการ加载ข้อมูลต่างๆโดยจะรับClosureเข้าไปเป็น参数ตัวหนึ่ง 功能ก็ทำงานจะโหลดหรืออะไรก็ว่าไป… กอทำงานเสร็จก็จะมาเรียก关闭ที่เราส่งเข้าไป Functionาใช้งาน功能นี้ไม่ว่าใน类ใดก็ตามก็จะต้องใส่Closureเข้าไปเพื่อบอกมันว่าจะต้องทำอะไรต่อเมื่อทำงานเสร็จ ynนยังว่ามันเป็นAsyn […]

RxSwift:subscribeOn与observeOn?

它允许您更改将在其上执行订阅代码的调度程序。 subscriptionOn更改其之前的调用的线程以及其后的方法。 顺序无关紧要,subscribeOn可以放在任何地方。 它允许您更改将在其上执行观察者代码的调度程序。 让我们了解两者: watchOn仅在下游工作 subscriptionOn位置无关紧要。 它在下游和上游工作 连续的subscribeOn不会更改线程 随之而来的watchOn确实改变了线程 观察值不能被subscribeOn覆盖 如果您有兴趣探索更多内容,RxJava中有一篇不错的文章: http://tomstechnicalblog.blogspot.com/2016/02/rxjava-understanding-observeon-and.html 您可以在以下位置找到我: Linkedin: Aaina Jain 推特: __aainajain 如果您对下一篇文章有​​任何建议,请给我发送电子邮件至aainajain100@gmail.com。

深入研究RxSwift中的一次性机制。

嘿大家! 作为反应型恋人 ,我将继续撰写有关RxSwift的系列文章。 在我的第一篇反应性文章中,我讲解了flatMap函数的一些改进(您可以在此处进行检查),今天我想通过探索所有Rx Disposables来扩展RxSwift的知识。 本文将通过简短的解释和用法示例来探索Rx中可用的所有Disposables。 所以,让我们开始吧! 🚀 1. Disposable.Empty 每当您需要满足接口要求并且不需要进行任何资源管理时,此功能就很有用。 在幕后,它使用私有类-NopDisposable (Nop =无操作) Rosberry的Shaggy iOS工程师。 被动式开放源代码爱好者和保留周期检测器🙂 还要检查我有关编程,Twitter和开源项目的电报频道:

像老板一样进行测试— RxSwift简介

在此处阅读全文 在最近的几篇文章中,我们一直在研究Streams –随时间变化的值。 掌握起来并不是很困难,我们一直在努力将它们集成到View Model中。 硬币的另一面虽然正在测试我们的代码。 我们如何使用RxSwift测试反应式代码? 我们使用一个名为RxTest的库。 RxTest使我们可以访问测试计划程序。 调度程序就像一件工作,通常我们将在特定线程上运行它,例如在先前的文章中,我们使用主调度程序实例将后台工作移至主线程上。 这里唯一的问题是序列添加到Rx思维方式的同一件事:时间本身。 流可以随时接收事件,因此,为了模拟我们只是伪造它们出现的时间,但是我们对顺序进行了具体说明。 更好的是,我们有一个网络呼叫需要20秒,我们可以伪造20秒而不必等待那么长时间的嘲笑。 考虑带有Rx的视图模型的一种好方法是输入需要提供的输入以及它们将产生的输出。 自然,我们想在此处测试输出,但是输入可能是搜索栏的文本值,这会触发网络调用,并且视图模型会公开我们可以测试的输出值。 它可能是结果列表,或者在这种情况下是String。 现在,让我们看一下如何进行视觉测试: 如你看到的。 视图模型具有输入和输出,这两个输入和输出都可以通过某种方式使数据突变。 就像工厂一样,数据被“绑定”到其中,它被更改并在最后创建一个可观察的对象作为输出,除了我们想在最后订阅该输出。 让我们看一个例子: 在测试目标中,请确保导入RxSwift,RxTest以及项目的@testable导入,以访问其视图模型和其他类似的类: 导入XCTest 导入RxSwift 导入RxTest @testable导入YourAppName 类YourAppName:XCTestCase { 我仅在此项目中使用CocoaPods,但您需要分别导入RxSwift和RxTest。 类ViewModel { //这是我们将向其发送输入的公共属性。 也许这可能是搜索栏的文本或标签的文本值。 公共变量输入:BehaviorSubject = BehaviorSubject (值:“”) //这是我们将测试的输出值 惰性var输出:BehaviorSubject = BehaviorSubject (值:“”) 让disposeBag = DisposeBag() //简单的初始化即可自动自动调用我们的订阅 在里面() { setupBindings() } //订阅更改的简单函数 私人功能setupBindings(){ input.subscribe(onNext:{[弱自我]值 self?.output.onNext(“更改的\(值)”) } […]

具有RxSwift的自动完成组件

反应式编程为代码重用提供了很大的机会。 使用RxSwift花费的时间越多,对我来说,将某些行为封装在可以在不同流程中使用的组件中就越直观。 我称它们为“ Rx组件”,既没有革命性也没有惊人的意义。 只是划分和征服Rx代码库的一种方法。 如果您想阅读其他人关于Rx世界的想法,请与我在一起-我们将构建Autocomplete功能。 我所谓的“接收组件”只是一个概念。 没有符合协议,也没有子类。 这是一般的插图: 对于其他开发人员,该组件是一个黑匣子 ,只有输入和输出要插入。 输入和输出在数量上是独立的。 组件实现行为 ,这是应用程序中的一个用例。 仅举几个例子: 自动完成功能—该组件接受简单的文本输入,并提供三个输出: 预测 , 错误和加载状态 (即网络调用或数据库查询)。 表格-接受多个不同类型的输入 。 提供相同数量的输出,每个输出针对相应的输入发出验证结果 。 验证结果可能包含描述数据错误的消息。 分页—接受具有给定索引的页面的输入,发出信号告知何时获取更多页面,并发出信号要求刷新第一页 。 加载状态输出是网络活动的简单指示。 每次组件获取新页面时, 页面输出都会发出整个已知页面集。 每个组件都应隔离,并且不可知 。 通过更改我们编排输出的方式,两者都使其可在不同的屏幕上重用。 一个示例可能是将分页组件的输出加载为在不同屏幕上转换为稍有不同的“等待”体验。 一旦我们构建了组件,就应该很容易对其进行单元测试 。 为了使其无缝,请确保所有依赖项都已被协议很好地抽象。 Rx Component 是一个黑匣子 ,只有输入和输出要插入。 它应该被隔离并不可知,以通过更改我们编排输出的方式使其在不同的屏幕上可重用。 希望您有主要想法。 如果没有,那没关系,我将逐步Autocomplete 在 RxSwift中构建Autocomplete 组件的 RxSwift 证明这一点。 这是我们将要构建的体验(请注意,活动期间状态栏中会显示加载指示器): 在Swift中也一样: 我的Rx组件是类 。 通常,它们符合某种用于依赖项注入的协议( AutocompleteType […]