這篇文章主要介紹了實際應(yīng)用 MVVM 的過程中的一些問題和解決方案
成都創(chuàng)新互聯(lián)專注于企業(yè)成都營銷網(wǎng)站建設(shè)、網(wǎng)站重做改版、阜城網(wǎng)站定制設(shè)計、自適應(yīng)品牌網(wǎng)站建設(shè)、H5響應(yīng)式網(wǎng)站、商城系統(tǒng)網(wǎng)站開發(fā)、集團公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)公司、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計等建站業(yè)務(wù),價格優(yōu)惠性價比高,為阜城等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。
MVVM(Model View ViewModel)是一種 MVC(Model View Controller)的一種變型,來解決 MVC 中龐大復(fù)雜的 Controller 難以維護的問題。大致上講 MVVM 有幾個要求:
MVVM 和 MVC 有很多類似的特點,主要的不同有:
另外一點,MVVM 默認 View 和 View Controller 有一個一對一的關(guān)系,一般我們把這兩個看做一個整體,會以 .swift 文件 和 Storyboard 的形式出現(xiàn)。
View Model 的工作是處理所有的展示數(shù)據(jù)的邏輯。如果一個 model 中有一個 NSDate 對象, NSDateFormatter 就會在 View Model 中用來設(shè)置日期的展示形式。
View Model 不能接觸任何用戶界面的部分,View Model 文件中不應(yīng)該 import UIKit ,View Controller 會觀察 View Model 去了解什么時候顯示新的數(shù)據(jù)(通過 KVO 或者 FRP(Functional Reactive Programming))
MVVM 和 MVC 有一個共同的弱點:沒有清楚的定義應(yīng)該把網(wǎng)絡(luò)請求部分放在哪里。在實際操作過程中,我會把網(wǎng)絡(luò)請求放在 View Model 文件里面,但之后我打算把網(wǎng)絡(luò)請求放在自己獨立的一個類中,View Model 文件會擁有這個對象。
下面我們主要談一談實際應(yīng)用 MVVM 過程中一些挑戰(zhàn):
例如你想構(gòu)造這樣一個常用的界面,有一個 segment control 在屏幕頂部,屏幕的其他部分是一個 collection view,選擇不同的 segment,就會展示不同樣式的 collection view,元素的排列順序。我們定義了一個 enum 來枚舉所有的排列樣式:
那么這個 enum 在 MVVM 模式中應(yīng)該放在哪里呢?因為這個 enum 決定了數(shù)據(jù)排列的順序,每個 cell 中的文字和按鈕的 title,這些都屬于展示的邏輯,所以這個 enum 看起來應(yīng)該放在 view model 中。
然而,這些 layout 并不改變要展示的數(shù)據(jù),只是決定了要呈現(xiàn)的數(shù)據(jù)的排列方式和排列順序,從這個角度上來說 enum 又應(yīng)該放在 view controller 中。
我的解決方法是把 enum 放在 view model 中,然后在 view model 中加一個對外的 Observable 或者 Signal 來表示使用了哪個 layout,基于用戶選擇的 segment,view model 更新這個值,然后在 view controller 中根據(jù)相應(yīng)的 layout 改變 collection view 的樣式,view controller 也可以根據(jù)這個值來決定用哪個 cell reuse identifier
iOS 開發(fā)者在用 MVVM 和 FRP 寫應(yīng)用的時候最常見的問題可能就是 ViewModel 怎么把數(shù)據(jù)展現(xiàn)給 ViewController。當(dāng) Model 層的數(shù)據(jù)發(fā)生變化更新的時候,ViewController 需要得到通知然后做出相應(yīng)的 UI 更新,我們一般會用到兩種機制:
第一個選項很吸引人,因為可以在 View Controller 中決定怎么選擇觀察那些 property。然而,我不推薦在 Swift 中使用第一個選項,因為 Swift 在 KVO 中沒有類型檢查,你需要對 AnyObject 強制轉(zhuǎn)換類型很多次。
第二個選項是比較 Swift 的方式,基于 Swift 的 generics 特性,signals,sequences,observables 可以支持編譯過程中的類型檢查。
但有時候在 view model 增加這些 Signals 或者 Observables 有些困難。Swift 的初始化方法對于什么時候?qū)?property 賦值有非常明確的規(guī)定。Signals 或者 Observables 需要使用 view model 內(nèi)部的狀態(tài),所以它們必須在 super.init() 之后才能創(chuàng)建,但是另一方面,我們在調(diào)用 super.init() 之前保證所有 property 已經(jīng)被賦值了,包括那些 Signal/Observable property。
這是個先有雞還是先有蛋的問題。
我采用比較簡單的解決方法:定義成 var 的隱式可選類型,這樣就可以在 super.init() 之后才給 property 賦值。這不是一個完美的解決辦法。我們可以用 lazy var property 的閉包賦值來代替上面的方法。在 Swift 不斷完善和更新的過程中,大家也可以探索其他更好的辦法。
舉一個很常用的例子,用戶點擊 collection view 中的一個 cell,跳轉(zhuǎn)到詳情頁面。用戶點擊的操作應(yīng)該在 view controller 中處理,具體內(nèi)容是展現(xiàn)一個新的詳情頁面。但是 view controller 不能直接接觸 models,我們要如何用 MVVM 模式實現(xiàn)這樣的用戶交互呢?
我的解決方案是利用 Swift 的閉包。首先在 view model 中定義一個閉包:
然后在 view model 中添加一個 property:
接著我需要調(diào)用閉包,在 view model 中定義一個view controller 可以調(diào)用的函數(shù),這個函數(shù)的參數(shù)是可以決定使用什么數(shù)據(jù),一般情況下常用 index path:
現(xiàn)在當(dāng)用戶選中一個 cell,會調(diào)用 view model 中的這個函數(shù),并且傳入 index path 參數(shù),view model 決定使用哪個數(shù)據(jù),并調(diào)用在 view controller 中定義的閉包,例如:
最后一個問題是怎么創(chuàng)建這個 view model。我們需要傳遞一個閉包給view model 的初始化函數(shù),然后用 lazy loading 來調(diào)用 view model 的初始化函數(shù)。
作者:匿名用戶
鏈接:
另一本是Big?Nerd?Ranch出的《Objective-C編程(第2版)》。(推薦華中師大出的版本)
img?src=""?data-rawwidth="333"?data-rawheight="413"?class="content_image"?width="333"
——————————————————————
2、視頻教程的話,只推薦我贏職場出的iOS移動開發(fā)課程。
教程鏈接如下:
iOS9實戰(zhàn)開發(fā)教程
img?src=""?data-rawwidth="398"?data-rawheight="202"?class="content_image"?width="398"
講的細致是這門課程最大的特點。因此,這款教程尤其適合那些零基礎(chǔ)學(xué)習(xí)iOS的學(xué)員。我贏職場知名度不夠,但是做的課程不錯,可惜沒人聽說過這個品牌。這款教程是從Objc一直講到iOS高編。所以跟著這款教程走,iOS開發(fā)基本也可以學(xué)的差不多。
——————————————————————
二、其次,你要學(xué)習(xí)API,了解iOS?UI控件
Objc階段的學(xué)習(xí)只是帶你入門,如果你想進階,API和UI控件是必須需要學(xué)的。一門語言可能會有成千上百的API和UI控件。你不需要把他們?nèi)加涀。恍枰涀∫恍┏S玫募纯伞?/p>
例如:Objc中的UITableView的dataSouce和delegate;NSDictionary、NSArray相關(guān)的增刪查改方法;JSON數(shù)組轉(zhuǎn)換方法;文件操作方法等。
UI控件的話,常用的有UIView、UITableView、UIScrollView、UIButton、UILable等。你要熟悉這些控件的屬性和相關(guān)的操作方法。
記憶這些東西,只靠死記硬背是不行的。多去寫代碼,多去實踐,這樣才能逐漸掌握。
學(xué)完這個階段,基本上就可以做出來一個簡單的APP了。由于沒有進一步學(xué)習(xí)高深的東西,咱們暫且不說流暢性和內(nèi)存。
UI控件部分的知識點如圖:
img?src=""?data-rawwidth="607"?data-rawheight="531"?class="origin_image?zh-lightbox-thumb"?width="607"?data-original=""
——————————————————————
三、最后,你還需要了解iOS開發(fā)的底層原理。
能學(xué)到這一部分已經(jīng)很不錯了。所謂專業(yè)的iOS開發(fā)工程師和一個業(yè)余的iOS開發(fā)愛好者基本也差在這最后一步了。這一部分的知識點也是在面試的時會經(jīng)常問道的。如果你想找一份iOS開發(fā)工程師的職位,這一部分是非學(xué)不可的。
這一部分的需要掌握的知識點包括:
iOS內(nèi)存管理、iOS運行時機制、RunLoop、多線程等
每一塊都需要掌握的很詳細。
你還要熟練使用類庫并閱讀類庫源碼,例如AFNetWorking、SDWeblmage等,這兩個是初學(xué)者必看的。
——————————————————————
這一階段的學(xué)習(xí)可以多去github上下載源代碼去閱讀。
推薦一些完整的源碼下載:
1、懶人筆記iOS客戶端
GitHub?-?liaojinxing/Voice2Note:?Voice2Note?iOS?client?source?codes.
2、《猿已閱》碼農(nóng)周刊iOS客戶端
GitHub?-?icepy/manong-reading:?《猿已閱》碼農(nóng)周刊?iOS?App(放棄維護,推薦大家下載《開發(fā)者頭條》App)
3、火狐瀏覽器iOS客戶端
GitHub?-?mozilla/firefox-ios:?Firefox?for?iOS
4、某位大神做的高仿網(wǎng)易新聞項目源碼
GitHub?-?dsxNiubility/SXNews:?High?imitation?Neteasy?News.?(include?list,detail,photoset,weather,feedback)
5、維基百科iOS客戶端
GitHub?-?wikimedia/wikipedia-ios:?The?official?Wikipedia?iOS?app.
6、品趣iOS客戶端
GitHub?-?ltebean/novel-design:?PinQu?ios?client
7、YoCelsius——一款天氣預(yù)報的應(yīng)用
GitHub?-?YouXianMing/YoCelsius:?A?weather?app?that?uses?animation?to?give?you?an?at-a-glance?look?at?the?weather.
8、密記iOS版——款簡單的筆記應(yīng)用
GitHub?-?iHTCboy/SecurityNote:?密記iOS版:本應(yīng)用主要功能是簡單筆記?!疽呀?jīng)開源,AppStroe可下載】The?application?of?the?main?function?is?a?simple?notes.
——————————————————————
四、關(guān)于swift語言的學(xué)習(xí)。
學(xué)習(xí)iOS開發(fā)分為Objc和swift兩個路線,以上介紹的是最經(jīng)典的Objc路線。如果你想靠學(xué)習(xí)iOS開發(fā)找到一份工作,就要選擇從Objc開始學(xué)起。因為絕大多數(shù)公司都是以O(shè)bjc為開發(fā)語言的。
然而swift作為一門現(xiàn)代語言,集合了很多編程語言的優(yōu)點,并且比Objc也更加簡單易學(xué),近幾年swift語言的發(fā)展勢頭十分不錯,大有取代Objc而代之的跡象。所以在這里建議題主把兩個語言都學(xué)習(xí)一下。并且Swift語言是在Objc的基礎(chǔ)上發(fā)明的,學(xué)完Objc,再學(xué)習(xí)swift也會更加容易。
關(guān)于swift路線的學(xué)習(xí),可以看看我贏職場的iOS開發(fā)教程,有大篇幅的章節(jié)去介紹swift語言,并且講得細致入微,十分適合新手學(xué)習(xí)。
教程鏈接:iOS9實戰(zhàn)移動開發(fā)(swift加強版)
img?src=""?data-rawwidth="860"?data-rawheight="589"?class="origin_image?zh-lightbox-thumb"?width="860"?data-original=""
五、下面把自己多年來私藏的一些學(xué)習(xí)iOS開發(fā)的網(wǎng)站推薦給大家。當(dāng)然這只是部分,贊數(shù)過百還會把這些資料再放出來一部分。所以,你們快點贊吧!
——————————————————————
iOS開發(fā)相關(guān)的網(wǎng)站:
1、我贏職場
上文已經(jīng)介紹過了,他們家的課程質(zhì)量算是很贊的了,教程最大的特點是特別適合新手學(xué)習(xí)。
2、tutsplus
不定時更新一些?iOS?教程
3、WWDC
蘋果官方每年一度的?WWDC?視頻,?可以了解歷年有關(guān)?iOS?發(fā)布的內(nèi)容。
4、asciiwwdc
WWDC?的文字版
5、Swift?by?Robin?Eggenkamp
該網(wǎng)站收集了很多關(guān)于?Swift?的學(xué)習(xí)資料,?新聞。
——————————————————————
郵件訂閱:
1、iOS?Dev?Weekly
每周一期,內(nèi)容多為這一星期里值得關(guān)注的?GitHub?項目、文章、工具等。
2、iOS?Design?Weekly
每周一期,會提供一些iOS開發(fā)的建議,新聞資訊以及創(chuàng)意方面的內(nèi)容。
《黑客攻防技術(shù)寶典》([美]Charlie Miller)電子書網(wǎng)盤下載免費在線閱讀
資源鏈接:
鏈接:
提取碼:vwga ?
書名:黑客攻防技術(shù)寶典
作者:[美]Charlie Miller
譯者:傅爾也
出版社:人民郵電出版社
出版年份:2013-9
頁數(shù):320
內(nèi)容簡介:安全始終是計算機和互聯(lián)網(wǎng)領(lǐng)域最重要的話題。進入移動互聯(lián)網(wǎng)時代,移動平臺和設(shè)備的安全問題更加突出。iOS系統(tǒng)憑借其在移動市場的占有率擁有著舉足輕重的地位。雖然iOS系統(tǒng)向來以安全著稱,但由其自身漏洞而引發(fā)的威脅同樣一直存在。
《黑客攻防技術(shù)寶典:iOS實戰(zhàn)篇》由美國國家安全局全球網(wǎng)絡(luò)漏洞攻擊分析師、連續(xù)4年P(guān)wn2Own黑客競賽大獎得主Charlie Miller領(lǐng)銜,6位業(yè)內(nèi)頂級專家合力打造,全面深入介紹了iOS的工作原理、安全架構(gòu)、安全風(fēng)險,揭秘了iOS越獄工作原理,探討了加密、代碼簽名、內(nèi)存保護、沙盒機制、iPhone模糊測試、漏洞攻擊程序、ROP有效載荷、基帶攻擊等內(nèi)容,為深入理解和保護iOS設(shè)備提供了足夠的知識與工具,是學(xué)習(xí)iOS設(shè)備工作原理、理解越獄和破解、開展iOS漏洞研究的重量級專著。
本書作為國內(nèi)第一本全面介紹iOS漏洞及攻防的專著,作者陣容空前豪華,內(nèi)容權(quán)威性毋庸置疑。Charlie Miller曾在美國國家安全局擔(dān)任全球網(wǎng)絡(luò)漏洞攻擊分析師5年,并連續(xù)4屆摘得Pwn2Own黑客競賽桂冠。Dionysus Blazakis擅長漏洞攻擊緩解技術(shù),2010年贏得了Pwnie Award最具創(chuàng)新研究獎。Dino Dai Zovi是Trail of Bits聯(lián)合創(chuàng)始人和首席技術(shù)官,有十余年信息安全領(lǐng)域從業(yè)經(jīng)驗,出版過兩部信息安全專著。Vincenzo Iozzo現(xiàn)任BlackHat和Shakacon安全會議評審委員會委員,因2010年和2011年連續(xù)兩屆獲得Pwn2Own比賽大獎在信息安全領(lǐng)域名聲大振。Stefan Esser是業(yè)界知名的PHP安全問題專家,是從原廠XBOX的硬盤上直接引導(dǎo)Linux成功的第一人。Ralf-Philipp Weinmann作為德國達姆施塔特工業(yè)大學(xué)密碼學(xué)博士、盧森堡大學(xué)博士后研究員,對密碼學(xué)、移動設(shè)備安全等都有深入研究。
本書適合想了解iOS設(shè)備工作原理的人,適合對越獄和破解感興趣的人,適合關(guān)注iOS應(yīng)用及數(shù)據(jù)安全的開發(fā)人員,適合公司技術(shù)管理人員(他們需要了解如何保障iOS設(shè)備安全),還適合從事iOS漏洞研究的安全研究人員。
作者簡介:Charlie Miller
Accuvant Labs首席研究顧問,曾在美國國家安全局擔(dān)任全球網(wǎng)絡(luò)漏洞攻擊分析師5年,連續(xù)4年贏得CanSecWest Pwn2Own黑客大賽。他發(fā)現(xiàn)了iPhone與G1安卓手機第一個公開的遠程漏洞,通過短信對iPhone進行漏洞攻擊并發(fā)現(xiàn)了可以讓惡意軟件進入iOS的代碼簽名機制缺陷。作為圣母大學(xué)博士的他還與人合著了The Mac Hacker's Handbook和Fuzzing for Software Security Testing and Quality Assurance兩本信息安全類圖書。
Dionysus Blazakis
程序員和安全研究人員,擅長漏洞攻擊緩解技術(shù),經(jīng)常在安全會議上發(fā)表有關(guān)漏洞攻擊緩解技術(shù)、繞過緩解技術(shù)和尋找漏洞的新方法等主題演講,因利用即時編譯器繞過數(shù)據(jù)執(zhí)行保護的技術(shù)贏得了2010年P(guān)wnie Award最具創(chuàng)新研究獎。另外,他與Charlie Miller為參加2011年P(guān)wn2Own大賽開發(fā)的iOS漏洞攻擊程序贏得了iPhone漏洞攻擊比賽的大獎。
Dino Dai Zovi
Trail of Bits聯(lián)合創(chuàng)始人和首席技術(shù)官,有十余年信息安全領(lǐng)域從業(yè)經(jīng)驗,
做過紅隊(red teaming,又稱“倫理黑客”)、滲透測試、軟件安全、信息安全管理和網(wǎng)絡(luò)安全研究與開發(fā)等多種工作。Dino是信息安全會議的???,在DEFCON、BlackHat和CanSecWest等世界知名的信息安全會議上發(fā)表過對內(nèi)存損壞利用技術(shù)、802.11無線客戶端攻擊和英特爾VT-x虛擬化rootkit程序等課題的獨立研究成果。他還是The Mac Hacker's Handbook和The Art of Software Security Testing的合著者。
Vincenzo Iozzo
Tiqad srl安全研究人員,BlackHat和Shakacon安全會議評審委員會成員,常在BlackHat和CanSecWest等信息安全會議上發(fā)表演講。他與人合作為BlackBerryOS和iPhoneOS編寫了漏洞攻擊程序,因2010年和2011年連續(xù)兩屆獲得Pwn2Own比賽大獎在信息安全領(lǐng)域名聲大振。
Stefan Esser
因在PHP安全方面的造詣為人熟知,2002年成為PHP核心開發(fā)者以來主要關(guān)注PHP和PHP應(yīng)用程序漏洞的研究,早期發(fā)表過很多關(guān)于CVS、Samba、OpenBSD或Internet Explorer等軟件中漏洞的報告。2003年他利用了XBOX字體加載器中存在的緩沖區(qū)溢出漏洞,成為從原廠XBOX的硬盤上直接引導(dǎo)Linux成功的第一人;2004年成立Hardened-PHP項目,旨在開發(fā)更安全的PHP,也就是Hardened-PHP(2006年融入Suhosin PHP安全系統(tǒng));2007年與人合辦德國Web應(yīng)用開發(fā)公司SektionEins GmbH并負責(zé)研發(fā)工作;2010年起積極研究iOS安全問題,并在2011年提供了一個用于越獄的漏洞攻擊程序(曾在蘋果多次更新后幸存下來)。
Ralf-Philipp Weinmann
德國達姆施塔特工業(yè)大學(xué)密碼學(xué)博士、盧森堡大學(xué)博士后研究員。他在信息安全方面的研究方向眾多,涉及密碼學(xué)、移動設(shè)備安全等很多主題。讓他聲名遠播的事跡包括參與讓W(xué)EP破解劇烈提速的項目、分析蘋果的FileVault加密、擅長逆向工程技術(shù)、攻破DECT中的專屬加密算法,以及成功通過智能手機的Web瀏覽器(Pwn2Own)和GSM協(xié)議棧進行滲透攻擊。