您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 创业/孵化 > 大神都在看的RxSwift的完全入坑手册
网址:edu.51CTO.com大神都在看的RxSwift的完全入坑手册RxSwift是我在Github上关注已久的一个项目,今天花点时间过了一下它的示例代码,感觉很有意思。我主要是通过项目里的Rx.playground进行学习和了解的,这种方式确实便捷高效。只需要把文档用/*:*/注释即可,直接用Markdown编写,简单方便。不过Xcode7中这种方式现在还不是很稳定,会有大量的空行,而且有个最大的问题就是阅读到中间然后切到其他文件再切回来的时候,阅读的进度条是从头开始的,并不能记录上次阅读的位置。心累。下面是我的简单笔记,只是把学习过程中的收获记录下来,大部分内容来自于项目内的playground。注意!是很大部分!而且操场里图文并茂,很容易理解。所以,各位如果感兴趣,建议clone官方项目,跑个操场玩玩。参考文献中罗列了我在学习过程中查阅的相关资料,可以作为补充阅读。SupportCode在进入正题之前,先看下项目里的SupportCode.swift,主要为playground提供了两个便利函数。一个是example函数,专门用来写示例代码的,统一输出log便于标记浏览,同时还能保持变量不污染全局:1.publicfuncexample(description:String,action:()-()){2.print(\n---\(description)example---)3.action()4.}另一个是delay函数,通过dispatch_after用来演示延时的:1.publicfuncdelay(delay:Double,closure:()-()){2.dispatch_after(3.dispatch_time(4.DISPATCH_TIME_NOW,5.Int64(delay*Double(NSEC_PER_SEC))6.),7.dispatch_get_main_queue(),closure)8.}网址:edu.51CTO.comIntroduction主要介绍了Rx的基础:Observable。ObservableElement是观察者模式中被观察的对象,相当于一个事件序列(GeneratorType),会向订阅者发送新产生的事件信息。事件信息分为三种:.Next(value)表示新的事件数据。.Completed表示事件序列的完结。.Error同样表示完结,但是代表异常导致的完结。(打个岔:协议命名,想起来上午汤哥在微博说的一段话:另外,我觉得protocol名字用形容词会更加语义分明,比如Swift:Flyable,Killable,Visible。全用名词的话显得比较生硬,比如Swift:Head,Wings,Ass。emptyempty是一个空的序列,它只发送.Completed消息。1.example(empty){2.letemptySequence:ObservableInt=empty()3.4.letsubscription=emptySequence5..subscribe{eventin6.print(event)7.}8.}9.10.---emptyexample---11.Completednevernever是没有任何元素、也不会发送任何事件的空序列。1.example(never){2.letneverSequence:ObservableString=never()3.4.letsubscription=neverSequence5..subscribe{_in6.print(Thisblockisnevercalled.)7.}8.}网址:edu.51CTO.com9.10.---neverexample---justjust是只包含一个元素的序列,它会先发送.Next(value),然后发送.Completed。1.example(just){2.letsingleElementSequence=just(32)3.4.letsubscription=singleElementSequence5..subscribe{eventin6.print(event)7.}8.}9.10.---justexample---11.Next(32)12.CompletedsequenceOfsequenceOf可以把一系列元素转换成事件序列。1.example(sequenceOf){2.letsequenceOfElements/*:ObservableInt*/=sequenceOf(0,1,2,3)3.4.letsubscription=sequenceOfElements5..subscribe{eventin6.print(event)7.}8.}9.10.---sequenceOfexample---11.Next(0)12.Next(1)13.Next(2)14.Next(3)15.Completed网址:edu.51CTO.comformform是通过asObservable()方法把Swift中的序列(SequenceType)转换成事件序列。1.example(from){2.letsequenceFromArray=[1,2,3,4,5].asObservable()3.4.letsubscription=sequenceFromArray5..subscribe{eventin6.print(event)7.}8.}9.10.---fromexample---11.Next(1)12.Next(2)13.Next(3)14.Next(4)15.Next(5)16.Completedcreatecreate可以通过闭包创建序列,通过.on(e:Event)添加事件。1.example(create){2.letmyJust={(singleElement:Int)-ObservableIntin3.returncreate{observerin4.observer.on(.Next(singleElement))5.observer.on(.Completed)6.7.returnNopDisposable.instance8.}9.}10.11.letsubscription=myJust(5)12..subscribe{eventin13.print(event)14.}15.}16.17.---createexample---18.Next(5)网址:edu.51CTO.com19.CompletedfailWithfailWith创建一个没有元素的序列,只会发送失败(.Error)事件。1.example(failWith){2.leterror=NSError(domain:Test,code:-1,userInfo:nil)3.4.leterroredSequence:ObservableInt=failWith(error)5.6.letsubscription=erroredSequence7..subscribe{eventin8.print(event)9.}10.}11.12.---failWithexample---13.Error(ErrorDomain=TestCode=-1Theoperationcouldn’tbecompleted.(Testerror-1.))deferreddeferred会等到有订阅者的时候再通过工厂方法创建Observable对象,每个订阅者订阅的对象都是内容相同而完全独立的序列。1.example(deferred){2.letdeferredSequence:ObservableInt=deferred{3.print(creating)4.returncreate{observerin5.print(emmiting)6.observer.on(.Next(0))7.observer.on(.Next(1))8.observer.on(.Next(2))9.10.returnNopDisposable.instance11.}12.}13.14.print(go)15.16.deferredSequence17..subscribe{eventin18.print(event)网址:edu.51CTO.com19.}20.21.deferredSequence22..subscribe{eventin23.print(event)24.}25.}26.27.---deferredexample---28.go29.creating30.emmiting31.Next(0)32.Next(1)33.Next(2)34.creating35.emmiting36.Next(0)37.Next(1)38.Next(2)为什么需要defferd这样一个奇怪的家伙呢?其实这相当于是一种延时加载,因为在添加监听的时候数据未必加载完毕,例如下面这个例子:1.example(TestDeferred){2.varvalue:String?=nil3.varsubscription:ObservableString?=just(value)4.5.//gotvalue6.value=Hello!7.8.subscription.subscribe{eventin9.print(event)10.}11.}12.13.---TestDeferredexample---14.Next(nil)15.Completed如果使用deffered则可以正常显示想要的数据:1.example(TestDeferred){网址:edu.51CTO.com2.varvalue:String?=nil3.varsubscription:ObservableString?=deferred{4.returnjust(value)5.}6.7.//gotvalue8.value=Hello!9.10.subscription.subscribe{eventin11.print(event)12.}13.14.}15.16.---TestDeferredexample---17.Next(Optional(Hello!))18.CompletedSubjects接下来是关于Subject的内容。Subject可以看做是一种代理和桥梁。它既是订阅者又是订阅源,这意味着它既可以订阅其他Observable对象,同时又可以对它的订阅者们发送事件。如果把Observable理解成不断输出事件的水管,那Subject就是套在上面的水龙头。它既怼着一根不断出水的水管,同时也向外面输送着新鲜水源。如果你直接用水杯接着水管的水,那可能导出来什么王水胶水完全把持不住;如果你在水龙头下面接着水,那你可以随心所欲的调成你想要的水速和水温。(好吧上面一段文档里没有,是我瞎掰的,如果理解错了还望打脸( ̄ε(# ̄)☆╰╮( ̄▽ ̄///))在开始下面的代码之前,先定义一个辅助函数用于输出数据:1.funcwriteSequenceToConsoleO:ObservableType(name:String,sequence:O){2.sequence3..subscribe{ein4.print(Subscription:\(name),event:\(e))5.}6.}网址:edu.51CTO.comPublishSubjectPublishSubject会发送订阅者从订阅之后的事件序列。1.example(PublishSubject){2.letsubject=PublishSubjectString()3.writeSequenceToConsole(1,sequence:subject)4.subject.on(.Next(a))5.subject.on(.Next(b))6
本文标题:大神都在看的RxSwift的完全入坑手册
链接地址:https://www.777doc.com/doc-2513804 .html