RxSwift ve RxCocoa’yaGiriş

Bugünsizlere 4个版本iOS开发人员hayatımdakullanmaktan ençokkeyifaldığımve beni daha iyi bir开发人员halinegetirdiğineinandığımbiraraçtanbahsetmek istiyorum。 Buyazıyıokuyarakgünümüzdeçokpopülerolan反应性程序,RxSwift和RxCocoa说,迅速发展,大力发展edebilecek seviyeyegeleceğinizeinanıyorum。 首席iOS开发人员olarakçalıştığımBundle News’da dayoğunbirşekildebuyapılarıkullandığımızıve gayet memnunolduğumuzubelirtmek isterim。

RxSwiftkütüphanesi使Swift’i tamamenfarklıbirşekildekullanmamızaolanaksağlıyor。 Bukütüphaneyleasenkron programlama yapmak hemçokkolay hem deçokdahaokunaklıhale geliyor。 dahasağlammimarilertasarlamanızave daha kaliteli uygulamalaryapmanızaolanaksağlıyor。

RxCocoa可以在iOS或OS X上运行,而可乐API可以在反应性中使用。

Buyazıdabilmeniz gereken konseptlerden biri可观察的vediğeriObserver’dır。

  • 可观察到的 (gözlemlenebilir),değişiklikleriyayımlayanyapılardır。
  • 观察员 (gözlemleyici)yapılar可观察到的yapılara订阅olarak,değişlikolduğundahaberleri olanyapılardır。

RxSwift和RxCocoa,ARC已售出DisposeBag denilen biraraçbulundurmaktadır。 DisposeBag’i观察员objeleritaşıyansanal birçantagibidüşünebiliriz。 Observer’larıtanımladığımızebeveyn objelerin(父对象)hafızadanuçtuğundaObserver’larındandadüzgünbirşekildekurtulmakiçinDisposeBagaracınıkullanırız。

Biraz kavramlar konusundakafanızkarışmışolabilir amayazınındevamındadaha iyianlayacaksınız。


大小RxSwift ve RxCocoakütüphanelerinidaha iyi anlatabilmekiçin反应性tekniklerikullanılmayanufak bir uygulamahazırladım。 Yazınındevamındaadımadımuygulamayı反应性bir haledöndüreceğiz。 咖啡馆,咖啡店,咖啡店,咖啡店,咖啡店,咖啡店,咖啡店,咖啡店,咖啡店,咖啡店,咖啡店,咖啡店,咖啡店和咖啡店。 Projenin ilk halini buradan indirip ,yapılacakdeğişiklikleribenimle birlikteadımadımyapmanızıözellikleöneririm。

不是: Projenin同类儿子halini terminalde git clone https://github.com/Goktug/RxSwift-RxCocoa-CoffeeShop-Medium.git komutunu kullanarak GitHub’dan clone’layabilirsiniz。

Projeyi indirip,zipdosyasındançıkardıktan声音RxSwift ve RxCocoaPod’larınıyüklemekiçinterminalinizden pod install komutunuçalıştırmanızgerekmektedir。 Podyüklemesibittikten声音CoffeeShop.xcworkspace ileaçmalısınız。


Kullanıcıdan 通过电子邮件发送了邮件 。 Burada后端ileiletişimkurangerçekbir认证mekanizmasıkullanmayacağız。 萨迪斯(Sadece)通过电子邮件发送了6封电子邮件。 请发送电子邮件给我,并发送电子邮件给我,并发送电子邮件给我。

LoginViewController.swift请发送电子邮件至电子邮件,然后输入textfield’lerini和Girişbutonunugörüyoruz。 Bununla birlikte logInButtonPressed()从头开始,然后从basıldığında到çalışmaktadır。 Gördüğünüzgibişuan texfield’leriçinherhangi bir validatemekanizmasıbulunmuyor。 Şimdibu sayfaya反应性计划prensiplerini kullanarak验证mekanizmasıekleyelim。

RakSwift ve RxCocoakütüphanelerini进口商品。

  导入RxSwift 
导入RxCocoa类LoginViewController:UIViewController {...}

RxSwift和RxCocoa在文本输入中说出textfield’,然后输入文本。 Bu说ededekullanıcının她的输入邮件正在发送,请发送电子邮件至。 登录登录。但是,登录后才能登录。 非反应性程序,在UITextFieldDelegate委托中, if/else则不进行其他操作。 反应性程序说出了自己的名字。

LoginViewController添加和删​​除。

 私人让disposeBag = DisposeBag() 

Dahaöncebahsettiğimgibi DisposeBag ,类“ımızın实例”ıhafızadanuçtuğunda(已分配),观察员“larındandadüzgünbirşekildekurtulmamızı(已处置)”sağlıyor。

Sınıfımızıniçersineaşağıdaki电子邮件doğrulamakodunu ekleyelim。 Bunu daha sonrakullanıcıdanaldığımız电子邮件girdisinidoğrulamakiçinkullanacağız。

Şimdikodumuza throttle mekanizmasınıEntegre edelim。 Aşağıdakikodusınıfınüstüneekleyelim。

 私人让节流阀间隔= 0.1 

Aşağıdakikodu daöncekiyazdığımızkodladeğiştirelim。

emailValid ve passwordValid &&操作符,ikisinin de trueolduğudurumda everythingValid均有效Validdeğişkenimizintrueolmasınıistiyoruz。 Aksi takdirde false Tipindedöndüreceğiz。 可观察到的登录logInButton已启用,已启用。 Bu da bize通过电子邮件发送girdilerinindoğruolduğudurumdagirişbutonunumuzun aktifolmasınıvetıklandığındadamenüsayfasınageçilmesineolanaktanıyacaktır。

Azağıdakikodu viewDidLoad metodunun enaltınaekleyelim。

Şimdibu sayfadaöncellikleRxCocoa kullanarak UITableView UI komponentimizi反应性yapacağız。 RxCocoa, UITableView和反应性API中的UITableViewDataSource UITableViewDelegate委托中的替代方法均应适用于卡尔梅亚克。 RxCocoa bizimiçinkendisi halledecek。

请选择MenuViewController.swift然后再选择UITableViewDataSource UITableViewDelegate扩展名。

Daha颂歌configureTableView()支持更多信息。 Artıkbu kodlaraihtiyacımızolmayacak。

  tableView.delegate =自我 
tableView.dataSource =自我

UITableViewDelegate基础上, configureTableView() tableView configureTableView()表空间中显示内容。 Oyüzdenaşağıdakikodu eklemeniz gerekmektedir。

  tableView.rowHeight = 104 

reactiveimdisıramenüdeyer alacak kahve verilerimizi table view’e反应性桦木şekildebağlamayageldi。 在反应堆中的表view’在反应堆中反应不佳。

Bunusağlamakiçin coffees değişkenini 可观察到的yapmamızgerekiyor。 Koduaşa​​ğıdakişekildegüncellememizgerekiyor。

Butonumuzda yer alankırmızıyuvarlağıniçersindekisayısepettekiürünmiktarınagöregüncellenmektedir。 MevcutyapımızdaMenuViewController’view viewWillAppear(:_) metodunda ShoppingCart modelimizden toplamsiparişadetini alan ve butondaki badge’igüncelleyenbir kodparçacığıbulunmaktadır。 ShoppingCartShoppingCart车模型模型coffees 可观察性可观察的视图将出现viewWillAppear(:_) metodununiçersindesiparişadetinin son halini almak zorundakalmayız。 反应性coffees壶中的作用,咖啡因coffees咖啡因的作用而变质。

ShoppingCart.swift轻松地完成所有任务。

  1. Burada ilk defa 可观察到 dışındabaşkabiryapıkullanıyoruz。 BehaviorRelay ,在Birwrapper’ıdır中的BehaviourSubject’。 Rx konseptinde 主题 ‘ler hem 可观察的 hem de 观察者 değişkenolarak davranabilen代理ya daköprülerdirdiyebiliriz。 Başkabiryazımdabu konseptleri dahadetaylıaçıklayacağım。 Fakatşimdilikbilmemiz gerekenşey; 行为主题订阅 debişkene, 订阅 olduğumuzdabize和son发出ettiğielemanıdöndürmesidir。
  2. 行为主题birdeğişkenin parametresineulaşarakSubject’e en儿子发出了edilenelemanıalabiliyoruz。 coffees. value coffees. value kodu bize [Coffee: Int] tipindeki dictionary’imizidöndürüyor。 我的字典,我的字典,我的字典,我的字典,我的字典。
  3. accept(:_) metoduyla行为主题tipindeki birdeğişkeniniçersineyeni bir eleman发出edebiliyoruz。
  4. Burada da ekleme yaparkenkullandığımızlaaynışekildedeğişkeniniçindeki和儿子değerialıp,gecicideğişkeneatıyoruz。 德文字典-简体中文字典’dençıkartıyoruz。
  5. Güncellediğimiz字典’i coffeesdeğişkenine发出ediyoruz。
  6. getTotalCost()方法Float Observable yerine Observable döndürenbir metodaçeviriyoruz。
  7. BehaviourRelay’in下摆可观察下摆观察者gibidavrandığındanbahsetmiştik。 coffees değişkeniiçersindebulunanelemanlarınfiyat bilgilerinialıp,toplamınıdöndürmemizgerekiyor。 Aynızamanda可观察到的birdeğişkenolarakdöndürmemizlazım。 Bunu yapmakiçin coffees değişkenini 地图 ‘leyerekiçindekielemanlaraulaşabilirizveistediğimizgibideğiştirebiliriz。
  8. getTotalCount()获取Observable döndürenbir metodaçeviriyoruz。
  9. Sepulu bulunan toplam kahve adetini 可观察到的olarakdöndürüyoruz。
  10. getCartItems()方法[CartItem] Observable döndürenbir metodaçeviriyoruz。
  11. Sepetsayfasındabulunan表view’dekullandığımızCartItem modelini 可观察到的 bir阵列olarakdöndürüyoruz。

ShoppingCart车modelimizartık反应性自行车yapıyaçevrildi。 Bulunla birlikteşuan projeniziçalıştırmakisterseniz Xcode’un birçokyerde hataverdiğinigöreceksiniz。 ProjenizibaşarılıbirşekildeçalıştırabilmekiçinShoppingCart modelinden veriokuduğumuzyerleri de active bir haleçevirmemizgerekiyor。

MenuViewController.swift视图中删除视图viewWillAppear(:_) WillAppear viewWillAppear(:_) metodumuzu tamamen silelim。

Azağıdakikodu viewDidLoad metodunun enaltınayapıştıralım。

ShoppingCartViewController.swift文件。 您可以在表格中查看反应性反应堆的硬体情况。 菜单sayfasındaöğrendiğimizşeyleritekrardanbahsetmeyeceğim。 Sadece yeni olaraköğreneceğimiz行/单元silmeolayını反应性桦木ekekildenasılgerçekleştirebileceğimizdenbahsedeceğim。

Şimdiaşağıdakikodu mevcut kodladeğiştirmeklebaşlayalım。

Ad admadımbu kodlar neyapıyorbakalım:

  1. 反应式扩展中的表视图’已删除modelDeleted(_:)modelDeleted(_:) metodunadönecekelemanıntipinipaslayıpçağırdığımızdametod bize表视图’den silinenelemanı可观察到的tipindedöndürür。
  2. Bu Observabledeğişkeni subscribe(onNext:) metoduniçindeki封闭’apaslarız。 卜封闭她的细胞silindiğindeçalışacaktır。
  3. 表格view’den silinen CartItem modelimizinbarındırdığı coffee objesini ShoppingCart modelimizden de siliyoruz。
  4. subscribe(onNext:)方法一次性 Tipinde birdeğişkendöndürür。 ShoppingCartViewController在Observer’dandüzgünbirşekildekurtulmakiçinbusınıfındisposeBag’ine eklememiz gerekmektedir中观察到。

Artıkneredeysetümprojemizi反应性桦木yapıyaçevirdik。 Bir tek OrderCoffeeViewController.swiftdosyasıkaldı。 大小不等,大小为evödeviolarakbırakıyorum。

Bu benim Medium’daki同类狂人。 ZamanbuldukçaiOS应用商店ilgiliyazılaryazmayıplanlıyorum。 您必须先完成以下任务。

RxSwift,RxCocoa ile ilgilisorularınızvarsa bana gktggumus@gmail.com adresinden电子邮件yolluylaulaşabilirsiniz。