iOS開發(fā)筆記-51:RxSwift使用指南

來自:http://www.cocoachina.com/swift/20170222/18727.html
用RxSwift仿寫知乎日報
2017-02-22 13:59 編輯: suiling 分類:Swift 來源:klike投稿**10 **5637

iOS蘋果Swift 3.iOS開發(fā)

用過無數(shù)的三方庫,卻仍舊寫不好代碼。以前總會有人問:你用過最好的三方庫是什么?那個時候總是會猶豫半天,到底是哪一個呢?好像都還可以耶,直到后來遇到[RxSwift],哇,簡直打開了新世界的大門?,F(xiàn)在我會毫不猶豫推薦它,雖然學習曲線有點陡峭,但是一旦你習慣上它,必深陷于其中無法自拔。
初入RxSwift
在公司項目進入版本迭代的時期,總覺得應該學點什么,不然讓拍在沙灘上怎么辦?在學習swift3一段時間后,邂逅了響應式編程方式,看了一下相關文章,毫不猶豫跳入RxSwift的坑中,其中險些放棄,還好堅持下來了,現(xiàn)在也算入了個門。當然只看看理論知識點,光紙上談兵是不行的,所以選擇仿寫知日報的方式來深化一下知識。

[Alamofire]:Swift版的AFNetworking。

[Moya]: 是 Artsy 團隊的 Ash Furrow 主導開發(fā)的一個網(wǎng)絡抽象層庫。它在 Alamofire 基礎上提供了一系列簡單的抽象接口,讓客戶端代碼不用去直接調(diào)用 Alamofire,也不用去關心 NSURLSession。同時提供了很多實用的功能,包括對RxSwift的良好擴展。

[HandyJSON]:是一個用于Swift語言中的JSON序列化/反序列化庫。與其他流行的Swift JSON庫相比,HandyJSON的特點是,它支持純swift類,使用也簡單。它反序列化時(把JSON轉換為Model)不要求Model從NSObject繼承(因為它不是基于KVC機制),也不要求你為Model定義一個Mapping函數(shù)。只要你定義好Model類,聲明它服從HandyJSON協(xié)議,HandyJSON就能自行以各個屬性的屬性名為Key,從JSON串中解析值。HandyJSON目前依賴于從Swift Runtime源碼中推斷的內(nèi)存規(guī)則,任何變動我們將隨時跟進。

[RxSwift]: 響應式編程三方庫。這里主要處理網(wǎng)絡請求時的各種回調(diào)和異步線程。

最終實現(xiàn)效果:

1487728949227379.png

API枚舉:
1487728989899738.png

由于Moya沒有支持HandyJSON擴展,這里我自己實現(xiàn)了此擴展:
1487729008595131.png

只要Model遵循HandyJSON協(xié)議,就能很優(yōu)雅的快速實現(xiàn)JSON->Model,包括嵌套解析:
1487729029731068.png

可以說,這是迄今為止我最滿意的網(wǎng)絡請求封裝,以后都可以愉快處理請求啦????
數(shù)據(jù)呈現(xiàn)
數(shù)據(jù)請求處理好了,就該綁定視圖顯示出來了,這里就是RxSwift的拿手好戲了。下面我們先看最簡單的展現(xiàn):
1487729067201941.png

這樣簡單的幾行代碼就完成網(wǎng)絡請求數(shù)據(jù)展現(xiàn)以及用戶響應一系列流程,什么代理,擴展都不用寫了,減少了一半以上的代碼,是不是看著就覺得爽炸了!我們再看看復雜一點的,分組tableview:
1487729091136869.png

其實也很簡單,就是需要綁定SectionModel,當然你也可以自定義SectionModel來分組展示,上面的代碼都在項目篩選出來的,具體實現(xiàn)可以看文末項目鏈接。
項目難點
菜單欄與主頁面的切換

1487729124664495.gif

由于導航欄一開始用的原生的(其實應該自定義,因為后面涉及到很多導航欄問題),所以左右平移的時候要把導航欄一起移動,所以遇到了一點問題,后來查找相關資料后解決了此問題:
1487729152159867.png

菜單欄的顯示和隱藏需要配合手勢,研究官方知乎日報App后,發(fā)現(xiàn)存在輕掃和拖拽滑動兩個手勢,相對應UIPanGestureRecognizer和UISwipeGestureRecognizer,當把這兩個視圖分別加在視圖上的時候,只會響應一個手勢,后來設置UIGestureRecognizerDelegate后避免了這個問題:
1487729176930393.png

本以為就此解決了問題,但是實際操作起來,手機很難區(qū)分這個兩個手勢,經(jīng)常會搞錯,本來想拖拽滑動結果系統(tǒng)識別為了輕掃手勢,體驗效果很差,那怎么辦呢?后來終于找到一種可行方案:只在視圖上添加UIPanGestureRecognizer,以手指操作時間來區(qū)分是輕掃還是拖拽滑動
1487729201950859.png

菜單欄與主頁面的切換中還有一個不好處理的點,當選中菜單欄某個主題后,要推出一個主題日報列表,與首頁不同屬于一個UINavigationController,那怎么從一個UINavigationController到另一個UINavigationController呢?試了好幾種方式來切換,始終達不到官方效果,忙碌了一天,最后靈光一現(xiàn)(也可能是我太蠢????)平常不是都用UITabBarController來切換UINavigationController?!真的好簡單,隱藏掉tabbar就好,幾句代碼就完美解決了這個場景切換問題:
1487729246823043.png

如果你有更好的切換方法請聯(lián)系我,愿意請你喝咖啡。
2. 文章的快速切換
1487729272779876.gif

文章詳情是用UIWebView加載html數(shù)據(jù)來展現(xiàn)的,這里我自定義class DetailWebView: UIWebView,以便于兩個文章詳情的切換,用于顯示文章詳情的DetailViewController包含兩個DetailWebView,一個webview用于展示當前頁面,另一個previousWeb放在屏幕外準備隨時切換文章,當發(fā)生切換文章時,動畫呈現(xiàn)previousWeb,并在后續(xù)移除在屏幕外webview,把previousWeb作為新的webview,同時生成新的previousWeb
1487729290948091.png

3.首頁刷新
Swift版的刷新控件三方還沒找比較好的,一度打算自己封裝一個,但是一直拖著,以后應該會寫。
知乎日報的刷新控件與一般放在tableview上不同,它應該是放在導航欄上面,配合tableview來實現(xiàn)刷新,這也是前面為什么說導航欄要自定義的原因之一,因為已經(jīng)用了原生的導航欄,只好巧妙(偷懶)加在了view上,其實這個刷新就是一個畫圓圈的過程。
注意事項
項目中關于時間的處理用的是 [SwiftDate]

.then 語法用的是 [Then],小而妙,很喜歡

總結

小生才疏學淺,未有編程天賦,難免有許多謬誤紕漏之處,各位看官當看且看,若有任何問題都可以提出,愿接受各種批評建議。要是覺得這篇文章稍有用處,可以給個star,十分感激。
項目源碼:[ZhiHu-RxSwift]

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 大多數(shù)的產(chǎn)品都支持環(huán)回接口( Loopback Interface),以允許運行在同一臺主機上的客戶 程序和服務器...
    張芳濤閱讀 1,187評論 0 1
  • 刷微信看到一個新聞,說是一個家庭賣掉家里唯一的房子,送孩子去澳洲讀大學,金融專業(yè),孩子六年后回國找工作,發(fā)現(xiàn)能找到...
    出口陳璋閱讀 866評論 0 4
  • 樓上兵長鎮(zhèn)!其實他不是我男神,我會告訴你其實我《進擊的巨人》都沒看過嗎?閑來無事這都是一年前畫的了。 現(xiàn)在才發(fā)現(xiàn)這...
    西山嬛閱讀 383評論 7 3

友情鏈接更多精彩內(nèi)容