真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

葉孤城ios開(kāi)發(fā)進(jìn)階,iOS開(kāi)發(fā)進(jìn)階

iOS 開(kāi)發(fā)中的 MVVM 模式——實(shí)用進(jìn)階篇(整理)

這篇文章主要介紹了實(shí)際應(yīng)用 MVVM 的過(guò)程中的一些問(wèn)題和解決方案

成都創(chuàng)新互聯(lián)致力于互聯(lián)網(wǎng)品牌建設(shè)與網(wǎng)絡(luò)營(yíng)銷(xiāo),包括成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、SEO優(yōu)化、網(wǎng)絡(luò)推廣、整站優(yōu)化營(yíng)銷(xiāo)策劃推廣、電子商務(wù)、移動(dòng)互聯(lián)網(wǎng)營(yíng)銷(xiāo)等。成都創(chuàng)新互聯(lián)為不同類(lèi)型的客戶提供良好的互聯(lián)網(wǎng)應(yīng)用定制及解決方案,成都創(chuàng)新互聯(lián)核心團(tuán)隊(duì)10多年專注互聯(lián)網(wǎng)開(kāi)發(fā),積累了豐富的網(wǎng)站經(jīng)驗(yàn),為廣大企業(yè)客戶提供一站式企業(yè)網(wǎng)站建設(shè)服務(wù),在網(wǎng)站建設(shè)行業(yè)內(nèi)樹(shù)立了良好口碑。

MVVM(Model View ViewModel)是一種 MVC(Model View Controller)的一種變型,來(lái)解決 MVC 中龐大復(fù)雜的 Controller 難以維護(hù)的問(wèn)題。大致上講 MVVM 有幾個(gè)要求:

MVVM 和 MVC 有很多類(lèi)似的特點(diǎn),主要的不同有:

另外一點(diǎn),MVVM 默認(rèn) View 和 View Controller 有一個(gè)一對(duì)一的關(guān)系,一般我們把這兩個(gè)看做一個(gè)整體,會(huì)以 .swift 文件 和 Storyboard 的形式出現(xiàn)。

View Model 的工作是處理所有的展示數(shù)據(jù)的邏輯。如果一個(gè) model 中有一個(gè) NSDate 對(duì)象, NSDateFormatter 就會(huì)在 View Model 中用來(lái)設(shè)置日期的展示形式。

View Model 不能接觸任何用戶界面的部分,View Model 文件中不應(yīng)該 import UIKit ,View Controller 會(huì)觀察 View Model 去了解什么時(shí)候顯示新的數(shù)據(jù)(通過(guò) KVO 或者 FRP(Functional Reactive Programming))

MVVM 和 MVC 有一個(gè)共同的弱點(diǎn):沒(méi)有清楚的定義應(yīng)該把網(wǎng)絡(luò)請(qǐng)求部分放在哪里。在實(shí)際操作過(guò)程中,我會(huì)把網(wǎng)絡(luò)請(qǐng)求放在 View Model 文件里面,但之后我打算把網(wǎng)絡(luò)請(qǐng)求放在自己獨(dú)立的一個(gè)類(lèi)中,View Model 文件會(huì)擁有這個(gè)對(duì)象。

下面我們主要談一談實(shí)際應(yīng)用 MVVM 過(guò)程中一些挑戰(zhàn):

例如你想構(gòu)造這樣一個(gè)常用的界面,有一個(gè) segment control 在屏幕頂部,屏幕的其他部分是一個(gè) collection view,選擇不同的 segment,就會(huì)展示不同樣式的 collection view,元素的排列順序。我們定義了一個(gè) enum 來(lái)枚舉所有的排列樣式:

那么這個(gè) enum 在 MVVM 模式中應(yīng)該放在哪里呢?因?yàn)檫@個(gè) enum 決定了數(shù)據(jù)排列的順序,每個(gè) cell 中的文字和按鈕的 title,這些都屬于展示的邏輯,所以這個(gè) enum 看起來(lái)應(yīng)該放在 view model 中。

然而,這些 layout 并不改變要展示的數(shù)據(jù),只是決定了要呈現(xiàn)的數(shù)據(jù)的排列方式和排列順序,從這個(gè)角度上來(lái)說(shuō) enum 又應(yīng)該放在 view controller 中。

我的解決方法是把 enum 放在 view model 中,然后在 view model 中加一個(gè)對(duì)外的 Observable 或者 Signal 來(lái)表示使用了哪個(gè) layout,基于用戶選擇的 segment,view model 更新這個(gè)值,然后在 view controller 中根據(jù)相應(yīng)的 layout 改變 collection view 的樣式,view controller 也可以根據(jù)這個(gè)值來(lái)決定用哪個(gè) cell reuse identifier

iOS 開(kāi)發(fā)者在用 MVVM 和 FRP 寫(xiě)應(yīng)用的時(shí)候最常見(jiàn)的問(wèn)題可能就是 ViewModel 怎么把數(shù)據(jù)展現(xiàn)給 ViewController。當(dāng) Model 層的數(shù)據(jù)發(fā)生變化更新的時(shí)候,ViewController 需要得到通知然后做出相應(yīng)的 UI 更新,我們一般會(huì)用到兩種機(jī)制:

第一個(gè)選項(xiàng)很吸引人,因?yàn)榭梢栽?View Controller 中決定怎么選擇觀察那些 property。然而,我不推薦在 Swift 中使用第一個(gè)選項(xiàng),因?yàn)?Swift 在 KVO 中沒(méi)有類(lèi)型檢查,你需要對(duì) AnyObject 強(qiáng)制轉(zhuǎn)換類(lèi)型很多次。

第二個(gè)選項(xiàng)是比較 Swift 的方式,基于 Swift 的 generics 特性,signals,sequences,observables 可以支持編譯過(guò)程中的類(lèi)型檢查。

但有時(shí)候在 view model 增加這些 Signals 或者 Observables 有些困難。Swift 的初始化方法對(duì)于什么時(shí)候?qū)?property 賦值有非常明確的規(guī)定。Signals 或者 Observables 需要使用 view model 內(nèi)部的狀態(tài),所以它們必須在 super.init() 之后才能創(chuàng)建,但是另一方面,我們?cè)谡{(diào)用 super.init() 之前保證所有 property 已經(jīng)被賦值了,包括那些 Signal/Observable property。

這是個(gè)先有雞還是先有蛋的問(wèn)題。

我采用比較簡(jiǎn)單的解決方法:定義成 var 的隱式可選類(lèi)型,這樣就可以在 super.init() 之后才給 property 賦值。這不是一個(gè)完美的解決辦法。我們可以用 lazy var property 的閉包賦值來(lái)代替上面的方法。在 Swift 不斷完善和更新的過(guò)程中,大家也可以探索其他更好的辦法。

舉一個(gè)很常用的例子,用戶點(diǎn)擊 collection view 中的一個(gè) cell,跳轉(zhuǎn)到詳情頁(yè)面。用戶點(diǎn)擊的操作應(yīng)該在 view controller 中處理,具體內(nèi)容是展現(xiàn)一個(gè)新的詳情頁(yè)面。但是 view controller 不能直接接觸 models,我們要如何用 MVVM 模式實(shí)現(xiàn)這樣的用戶交互呢?

我的解決方案是利用 Swift 的閉包。首先在 view model 中定義一個(gè)閉包:

然后在 view model 中添加一個(gè) property:

接著我需要調(diào)用閉包,在 view model 中定義一個(gè)view controller 可以調(diào)用的函數(shù),這個(gè)函數(shù)的參數(shù)是可以決定使用什么數(shù)據(jù),一般情況下常用 index path:

現(xiàn)在當(dāng)用戶選中一個(gè) cell,會(huì)調(diào)用 view model 中的這個(gè)函數(shù),并且傳入 index path 參數(shù),view model 決定使用哪個(gè)數(shù)據(jù),并調(diào)用在 view controller 中定義的閉包,例如:

最后一個(gè)問(wèn)題是怎么創(chuàng)建這個(gè) view model。我們需要傳遞一個(gè)閉包給view model 的初始化函數(shù),然后用 lazy loading 來(lái)調(diào)用 view model 的初始化函數(shù)。

3 -- 收回鍵盤(pán)幾種方法

收起鍵盤(pán)的方法:

這個(gè)方法是我不久前碰到的,覺(jué)得有用,就記下來(lái)了。

該點(diǎn)源自:《iOS開(kāi)發(fā)進(jìn)階》 —— 唐巧

總結(jié)

我總結(jié)出來(lái)了四種收起鍵盤(pán)的方法,使用場(chǎng)合如下:當(dāng)你能獲取到 UITextField 對(duì)象時(shí),最好使用 [obj resignFirstResponder] 方法; 如果有很多個(gè) UITextField 對(duì)象,你也可以獲取到 viewController 的 view 時(shí),你可以使用 [[[UIApplication sharedApplication] keyWindow] endEditing:YES] 方法; 如果當(dāng)前 ViewController比較難獲取,那么可以使用第3種或第4種方法。

iOS 開(kāi)發(fā)怎么入門(mén)

著作權(quán)歸作者所有。

商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。

作者:Franz Fang

鏈接:

來(lái)源:知乎

不管是斯坦福大學(xué)的CS193p公開(kāi)課、蘋(píng)果官方文檔、絕大多數(shù)市場(chǎng)上龐雜的教學(xué)書(shū)籍都不是很適合入門(mén)同學(xué)看,想入門(mén)的話應(yīng)該選用學(xué)習(xí)成本最低的方法,從最最基本開(kāi)始講起,并不是一味的講解語(yǔ)法與知識(shí),而是一邊實(shí)踐一邊學(xué)習(xí)知識(shí)才是最好的學(xué)習(xí)方法。

并且我想告訴題主,你問(wèn)的是iOS 開(kāi)發(fā)怎么入門(mén),但是你補(bǔ)充說(shuō)明里說(shuō)道的設(shè)計(jì)模式、內(nèi)存管理等內(nèi)容暫時(shí)不用你關(guān)心,等你真正iOS入門(mén)了以后在研究吧。也許我可以這么定義你的問(wèn)題:

一個(gè)略懂編程的人并且完全沒(méi)有接觸過(guò)IOS開(kāi)發(fā)的人想要學(xué)習(xí)IOS開(kāi)發(fā)應(yīng)如何學(xué)習(xí)?

--------------- 2015.5.15 更新 --------------

增加了怎么在Github上找優(yōu)質(zhì)OC項(xiàng)目

動(dòng)畫(huà)效果推薦的教程

部分段落重新組織了語(yǔ)言

(一)objective-c語(yǔ)言開(kāi)發(fā)iOS應(yīng)用

為什么不讓初學(xué)者看斯坦福教程:我以為,斯坦福大學(xué)IOS公開(kāi)課不適合入門(mén)的同學(xué)看,里面第一課講解的就是MVC模式。對(duì)于一個(gè)剛?cè)腴T(mén)想要學(xué)習(xí)的IOS的同學(xué)可能就完全懵了,心里想:“我特么第一課都聽(tīng)不懂我后面還學(xué)個(gè)P啊”。如果以前沒(méi)接觸過(guò)面向?qū)ο蟮恼Z(yǔ)言學(xué)習(xí)的熱情肯定大打折扣。

為什么不讓初學(xué)者看蘋(píng)果官方文檔:我還以為,蘋(píng)果官方文檔的內(nèi)容雖然權(quán)威但example對(duì)初學(xué)者一點(diǎn)都不友好,而且個(gè)人認(rèn)為中文譯文翻譯不是令初學(xué)者很容易理解。初學(xué)階段,教程的易理解程度我認(rèn)為是非常重要的一點(diǎn)。(實(shí)在要看請(qǐng)看英文原版。)

我不否認(rèn)以上兩者是極好的學(xué)習(xí)材料,如果你入門(mén)了iOS開(kāi)發(fā)并且有一定的英文功底,我是非常推薦你去看的,尤其官方文檔,應(yīng)該經(jīng)常翻閱。但是我認(rèn)為保持學(xué)習(xí)的熱情是最重要的。本著這個(gè)理念,我推薦的學(xué)習(xí)方法難度非常低,希望你們能滿意。

第一階段: RayWenderlich網(wǎng)站中的 The iOS Apprentice教程 (難度指數(shù):※)

img src="" data-rawwidth="646" data-rawheight="560" class="origin_image zh-lightbox-thumb" width="646" data-original=""以上有幾個(gè)答案提到了這個(gè)網(wǎng)站,但看什么教程沒(méi)有細(xì)說(shuō),我在這里簡(jiǎn)單說(shuō)說(shuō)。The iOS Apprentice的教程針對(duì)完全沒(méi)有編程經(jīng)驗(yàn)的人設(shè)計(jì)。這個(gè)教程是外國(guó)人寫(xiě)的并且有免費(fèi)試讀版,感興趣的人要看看。里面說(shuō)的東西都非常非?;?,里面一個(gè)共講解了4個(gè)不同類(lèi)型app,強(qiáng)烈建議一步一步按照上面所寫(xiě)的步驟敲一遍代碼。其中你會(huì)遇到很多復(fù)雜的語(yǔ)句和長(zhǎng)的可怕的函數(shù),你不用感到恐慌,照著敲,知道它干嘛用完全OK了,隨著你編程時(shí)間以及經(jīng)驗(yàn)的增加,你都會(huì)懂得。以上有幾個(gè)答案提到了這個(gè)網(wǎng)站,但看什么教程沒(méi)有細(xì)說(shuō),我在這里簡(jiǎn)單說(shuō)說(shuō)。The iOS Apprentice的教程針對(duì)完全沒(méi)有編程經(jīng)驗(yàn)的人設(shè)計(jì)。這個(gè)教程是外國(guó)人寫(xiě)的并且有免費(fèi)試讀版,感興趣的人要看看。里面說(shuō)的東西都非常非?;荆锩嬉粋€(gè)共講解了4個(gè)不同類(lèi)型app,強(qiáng)烈建議一步一步按照上面所寫(xiě)的步驟敲一遍代碼。其中你會(huì)遇到很多復(fù)雜的語(yǔ)句和長(zhǎng)的可怕的函數(shù),你不用感到恐慌,照著敲,知道它干嘛用完全OK了,隨著你編程時(shí)間以及經(jīng)驗(yàn)的增加,你都會(huì)懂得。

附鏈接:

注:這個(gè)教程是英文原版,并且收費(fèi),只免費(fèi)提供一個(gè)app的教程。如果看完了這個(gè)免費(fèi)的教程覺(jué)得還挺想繼續(xù)學(xué)的請(qǐng)參考 @王寒 老師的翻譯教程(只有前3個(gè)app教程,第4個(gè)教程剛出,國(guó)內(nèi)應(yīng)該還沒(méi)有人翻譯,如果想看只能付費(fèi))。PS:(現(xiàn)在開(kāi)發(fā)iOS應(yīng)用基本都是用Objective-C,至于剛出來(lái)的Swift現(xiàn)階段暫時(shí)不推薦學(xué)習(xí),如果想了解王寒老師也做了swift版本的The iOS Apprentice教程翻譯,自己去找)

附上王寒老師教程下載地址:

第二階段:培訓(xùn)班的網(wǎng)絡(luò)課程及入門(mén)書(shū)籍

經(jīng)過(guò)第一個(gè)階段你應(yīng)該已經(jīng)大致掌握IOS開(kāi)發(fā)流程,能編寫(xiě)一個(gè)非常簡(jiǎn)單的應(yīng)用了。這時(shí)候相信你的熱情應(yīng)該會(huì)很高漲,但接下來(lái)的學(xué)習(xí)可能會(huì)很枯燥,做好準(zhǔn)備。網(wǎng)絡(luò)課程的話推薦李明杰的課程,不推薦其他的。(他目前在廣州創(chuàng)業(yè)建立自己的培訓(xùn)品牌,沒(méi)有自制力看網(wǎng)絡(luò)課程的請(qǐng)去找他。杰哥開(kāi)源了一些非常優(yōu)秀的框架如:MJExtension )

建議首先要惡補(bǔ)基礎(chǔ)知識(shí)。經(jīng)過(guò)第一個(gè)階段你可能覺(jué)得你懂不少了,但是只是表面,尤其是沒(méi)學(xué)過(guò)編程的應(yīng)該好好學(xué)習(xí)一下視頻前面的課程,主要看看語(yǔ)法。等你看惡心了看煩了就去看視頻里UI部分,這里相對(duì)于來(lái)說(shuō)比較輕松,一定要把視頻里寫(xiě)的語(yǔ)句打一遍,相信這樣你理解會(huì)更深刻。里面說(shuō)的不清楚的地方上網(wǎng)可以百度,可以查書(shū)(如果你有書(shū)的話)。

Q:視頻教程是用來(lái)做什么的?

A:光有實(shí)踐沒(méi)有知識(shí)是寫(xiě)不好程序的,第一階段基本都是實(shí)踐,第二部分則是用來(lái)查缺補(bǔ)漏。 之所以推薦網(wǎng)絡(luò)課程是因?yàn)橹v解的比較系統(tǒng),各種入門(mén)知識(shí)都會(huì)涉及。因?yàn)閕OS所涉及內(nèi)容龐 大單看幾本書(shū)還是涉及不全的。

Q:上不上培訓(xùn)班?

A:個(gè)人意見(jiàn)是不推薦去,自學(xué)足夠了?,F(xiàn)在學(xué)習(xí)iOS的環(huán)境比前幾年好太多了,光憑借網(wǎng)上的資料是 完全可以的學(xué)得很好的,如果你連這點(diǎn)學(xué)習(xí)能力還沒(méi)有我也不相信你將來(lái)能成為一個(gè)很優(yōu)秀的工程師。而且你會(huì)發(fā)現(xiàn)在社會(huì)上一些互聯(lián)網(wǎng)公司是拒絕接收培訓(xùn)班出來(lái)的人。

推薦入門(mén)書(shū)籍:

tips:以下所有書(shū)籍有英文版看英文版,有最新版看最新版

1、《Objective-C 程序設(shè)計(jì)》(難度指數(shù):※※)

2、《iOS 7應(yīng)用開(kāi)發(fā)入門(mén)經(jīng)典》(難度指數(shù):※※)

3、《iOS開(kāi)發(fā)指南-0基礎(chǔ)到AppStore上架》(難度指數(shù):※※※)

4、《iOS編程實(shí)戰(zhàn)》(難度指數(shù):※※※※)

這里面講解的很清楚,后面甚至有簡(jiǎn)單的項(xiàng)目可以練手,這對(duì)于看視頻教程看惡心的同學(xué)是個(gè)福音~(yú)你可以先做項(xiàng)目遇到不懂的再看視頻。

這里我想多說(shuō)一句,買(mǎi)iOS開(kāi)發(fā)的輔導(dǎo)書(shū)千萬(wàn)別買(mǎi)過(guò)時(shí)太久的,我看以上有答案還推薦iOS4系列叢書(shū)呢...拜托現(xiàn)在都什么年代了,現(xiàn)在iOS8教程都要出來(lái)了,你iOS6的教程都過(guò)時(shí)好久了更別提iOS4了...對(duì)于新出的swift語(yǔ)言好多人難以選擇不知道該學(xué)OC好還是Swift好。我個(gè)人建議現(xiàn)在學(xué)OC,一門(mén)新語(yǔ)言的誕生需要經(jīng)過(guò)時(shí)間的考驗(yàn)與洗禮。等你學(xué)好了OC以后再看也不遲。

第三階段及以后

到這個(gè)階段你應(yīng)該擁有了充分的自學(xué)能力,已經(jīng)達(dá)到了入門(mén)水平。

這時(shí)候以下網(wǎng)址將成為你的家常便飯:

Github,StackOverFlow

如果你編程遇到困難,在StackOverFlow上面應(yīng)該都能找到合適的解答。(前提是你英文不要太差)。Github上好多開(kāi)源代碼足夠豐富你的眼界。如果你想成為一個(gè)iOS開(kāi)發(fā)者的話這上面兩個(gè)網(wǎng)站是你經(jīng)常以及必須會(huì)用到的。

Github上怎么搜牛人們的項(xiàng)目:

img src="" data-rawwidth="425" data-rawheight="360" class="origin_image zh-lightbox-thumb" width="425" data-original=""

想學(xué)一點(diǎn)UI的同學(xué)可以看:

1、iOS by Tutorials

2、design+code 網(wǎng)址:

想學(xué)一點(diǎn)動(dòng)效/交互的同學(xué)可以看:

1、下載QuartzComposer及相關(guān)插件如Origami,教程: Quartz Composer學(xué)習(xí)

想學(xué)applewatch開(kāi)發(fā)的同學(xué)可以看:

1、《watchKit》raywenderlich剛推出這個(gè)教程,英文版無(wú)譯文。

進(jìn)價(jià)書(shū)單:

1、《Effective Objective-C 2.0》(必看)

2、《Objective-C高級(jí)編程 iOS與OS X多線程和內(nèi)存管理》

3、《iOS開(kāi)發(fā)進(jìn)階》

4、《iOS Auto Layout 開(kāi)發(fā)秘籍》

推薦博客及網(wǎng)站:

1、Github:

2、StackOverFlow:

3、Code4App:

4、cocoachina:

5、objc中國(guó):

進(jìn)階博客(排名不分先后..)

1、王巍的博客(我們都叫它喵神,他很萌噠)

鏈接: (難度指數(shù):※※※※※)

理由:他的swift的新書(shū)講解的非常好,但不適合入門(mén),進(jìn)階的話這是很適合的一本書(shū)。其他關(guān)于OC的內(nèi)容可以翻看喵神的博客。

2、唐巧哥的技術(shù)博客

鏈接: iOS開(kāi)發(fā)如何提高 (難度指數(shù):※※※※※)

理由:據(jù)傳說(shuō)是iOS圈的劉德華。巧哥05年1月會(huì)出一本進(jìn)階的書(shū),可以關(guān)注以下。

3、葉孤城的技術(shù)博客 :

鏈接:葉孤城帶你讀源碼之RESideMenu (難度指數(shù):※※※)

理由:葉孤城童鞋的風(fēng)格就是講解細(xì)膩,通俗易懂。

4、破船之家:

鏈接:beyondvincent.com 的頁(yè)面 (難度指數(shù):※※※)

理由:破船的博客內(nèi)容很全面,一些開(kāi)發(fā)筆記,技巧他都會(huì)教給你。

5、Xcode Dev

鏈接: Xcode Dev (難度指數(shù):※※※※)

理由:也是一位大神的原創(chuàng)博客,內(nèi)容很值得學(xué)習(xí)。

6、txx's 的博客(我們都叫它蝦神,他也超萌噠)

鏈接: txx's blog

理由: 90后非常優(yōu)秀的iOS開(kāi)發(fā)者,看看他的大學(xué)時(shí)期的經(jīng)歷才發(fā)現(xiàn)我們過(guò)的是多么懈怠,大神之所以為大神也是有原因的。

7、Kevin的博客

鏈接: Kevin Blog

理由:周楷雯是一個(gè)非常厲害的90后iOS開(kāi)發(fā)者,他前些年寫(xiě)的項(xiàng)目在Github上擁有2500+star (PNchat?忘了)非常恐怖。

8、念茜姐姐的blog

鏈接: 新博客: 舊博客:念茜的博客

理由: iOS圈里的女神級(jí)人物,她寫(xiě)的iOS安全類(lèi)的文章非常值得一看。

9、孫源的blog

鏈接: sunnyxx的技術(shù)博客

理由:90后iOS開(kāi)發(fā)者,技術(shù)同樣非常強(qiáng),目前似乎在百度知道任職。

等等...iOS圈內(nèi)值實(shí)力很強(qiáng)又懂得分享知識(shí)的開(kāi)發(fā)者絕不止以上幾位,我隨時(shí)想到隨時(shí)再補(bǔ)充。

(二)swift語(yǔ)言開(kāi)發(fā)iOS應(yīng)用

這里推薦兩個(gè)入門(mén)學(xué)習(xí)比較好的方法

1、的網(wǎng)站(難度指數(shù):※)

非常淺顯易懂的入門(mén)級(jí)swift教程:

這個(gè)網(wǎng)站可以看兩方面:

(1)、隨時(shí)更新的swift tips (有一定水平在看)

(2)、新手主要看以下這本書(shū)img src="" data-rawwidth="390" data-rawheight="434" class="content_image" width="390"

2、《Swift Tutorials》 依然是raywenderlich出品,目前只有英文版。(難度指數(shù):※)

3、官方swift譯文教程 《The Swift Programming Language》中文版 (難度指數(shù):※※)

4、上文提到的王巍的博客(喵神)《Swifter - 100 個(gè) Swift 必備 tips》(難度指數(shù):※※※※)

喵神的這本書(shū)網(wǎng)上就有售賣(mài),請(qǐng)支持正版,絕對(duì)是不可多得的進(jìn)價(jià)書(shū)籍,此書(shū)并非傳統(tǒng)意義上的教程,是以tip的方式呈獻(xiàn)給大家的。

iOS開(kāi)發(fā)進(jìn)階- 閱讀時(shí)長(zhǎng)統(tǒng)計(jì)&復(fù)雜頁(yè)面架構(gòu)

記錄器

基于不同的場(chǎng)景提供關(guān)于記錄的封裝、適配。一般分為頁(yè)面式,流式,自定義式。

記錄管理者

管理統(tǒng)計(jì)記錄數(shù)據(jù),包含記錄緩存,磁盤(pán)存儲(chǔ),上傳器。

如何降低數(shù)據(jù)的丟失率?

兩種解決方案:

記錄上傳的時(shí)機(jī)

上傳時(shí)機(jī)的選擇

從三個(gè)方面分析架構(gòu)設(shè)計(jì):整體架構(gòu)、數(shù)據(jù)流、反向更新。

View 的功能包含:控件的初始化、設(shè)置數(shù)據(jù)、交互事件代理等。

ViewController 的功能:視圖創(chuàng)建與組合、協(xié)調(diào)邏輯、事件回調(diào)處理等,事件回調(diào)處理指的是視圖層的事件。

業(yè)務(wù)邏輯處理(預(yù)排版)、數(shù)據(jù)增刪改查封裝者、線程安全處理。

網(wǎng)絡(luò)請(qǐng)求、數(shù)據(jù)解析、增刪改查、本地處理邏輯(適配)

數(shù)據(jù)流包含:網(wǎng)絡(luò)數(shù)據(jù)、業(yè)務(wù)數(shù)據(jù)、UI數(shù)據(jù)三部分。

網(wǎng)絡(luò)數(shù)據(jù)經(jīng)過(guò) Engine 層處理加工產(chǎn)生業(yè)務(wù)數(shù)據(jù),業(yè)務(wù)數(shù)據(jù)經(jīng)過(guò) ViewModel 層處理產(chǎn)生UI數(shù)據(jù),UI數(shù)據(jù)會(huì)轉(zhuǎn)交給視圖控制器控制視圖的顯示。

用戶交互網(wǎng)絡(luò)刷新等都會(huì)導(dǎo)致視圖層變化,通過(guò)代理方式通知視圖控制器??刂破鲗?duì)ViewModel的強(qiáng)引用找到對(duì)應(yīng)ViewModel,然后通過(guò)UI數(shù)據(jù)對(duì)業(yè)務(wù)數(shù)據(jù)的弱引用找到對(duì)應(yīng)的業(yè)務(wù)數(shù)據(jù)同時(shí)打上臟標(biāo)記。最后ViewModel進(jìn)行數(shù)據(jù)流的重新驅(qū)動(dòng),將臟數(shù)據(jù)重新處理生成新的UI數(shù)據(jù)更新視圖。

本節(jié)梳理時(shí)長(zhǎng)統(tǒng)計(jì)實(shí)現(xiàn)原理和復(fù)雜頁(yè)面的架構(gòu)實(shí)現(xiàn)思路。

【iOS】(一)GPUImage的結(jié)構(gòu),濾鏡鏈的實(shí)現(xiàn)原理

學(xué)了OpenGL,OpenGLES后,去閱讀了GPUImage的源碼,使用了一段時(shí)間,接下來(lái),記錄一下我對(duì)GPUImage使用和源碼閱讀的一些分析吧。

相關(guān)引用

從0打造一個(gè)GPUImage(6)-GPUImage的多濾鏡處理邏輯

對(duì)于GPUImage,可以分為

上面也提了,所謂的GPUImage濾鏡鏈就是

GPUImageOutput - filter - filter - GPUImageInput

GPUImageOutput 通過(guò)target數(shù)組(里面都是實(shí)現(xiàn) GPUImageInput 組件),組成了濾鏡鏈的關(guān)系,我們需要牢牢的記住這個(gè)濾鏡鏈的關(guān)系,這樣開(kāi)發(fā)的時(shí)候,我們就知道如何Debug,如何實(shí)現(xiàn)我們需要的效果。那么問(wèn)題來(lái)了,為什么GPUImage可以實(shí)現(xiàn)這樣的濾鏡鏈呢?

這里我們先拋開(kāi)GPUImage,用OpenGL ES去實(shí)現(xiàn)一個(gè)具有濾鏡疊加效果的Demo,這里的Demo我是參考葉孤城的這篇文章, 從0打造一個(gè)GPUImage(6)-GPUImage的多濾鏡處理邏輯

Demo需要實(shí)現(xiàn)的效果,是將一張圖片,先后通過(guò)疊加 亮度濾鏡 , 飽和度濾鏡 最后顯示在屏幕上。

那么對(duì)應(yīng)的OpenGLES,我們會(huì)怎么做呢?首先我們需要以下東西

從以上的步驟,我們可以總結(jié)以下結(jié)論

對(duì)于這個(gè)Demo的一個(gè)流程圖,可以參考 從0打造一個(gè)GPUImage(6)-GPUImage的多濾鏡處理邏輯 的一幅圖,Demo的詳細(xì)實(shí)現(xiàn)請(qǐng)看原文吧。

以上就是GPUImage對(duì)于濾鏡鏈的實(shí)現(xiàn)原理,只有你懂了OpenGL ES的渲染流程,才能徹底的明白GPUImage的濾鏡鏈的原理。所以時(shí)時(shí)刻刻記住以下關(guān)系

GPUImageOutput - filter - filter - GPUImageInput

當(dāng)然也可以存在多個(gè)Source,多個(gè)Input的情況,例如要給一個(gè)視頻添加水印,用 GPUImageMovie 用于輸出視頻紋理,用 GPUImageUIElement 輸出UI空間的紋理,通過(guò)一個(gè)filter進(jìn)行Blend,最后用一個(gè) GPUImageView 進(jìn)行預(yù)覽,用 GPUImageMovieWriter 進(jìn)行輸出,濾鏡鏈關(guān)系如下


文章題目:葉孤城ios開(kāi)發(fā)進(jìn)階,iOS開(kāi)發(fā)進(jìn)階
網(wǎng)站URL:http://weahome.cn/article/phepeh.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部