iOS-KVO-GCD-Block-Delegate-單例-NSUserDefaults

這里集成了以上所有的小例子,幫助理解,先上demo:GitHub - paradisery/iOS-KVO-GCD-Block-Delegate-shareInstance-NSUserDefaults-Demo: KVO-GCD-Block-Delegate-單例-NSUserDefaults傳值 詳解

KVO: ?

在MVC設(shè)計(jì)架構(gòu)下的項(xiàng)目,KVO機(jī)制很適合實(shí)現(xiàn)mode模型和view視圖之間的通訊。

代碼中,在模型類A創(chuàng)建屬性數(shù)據(jù),在控制器中創(chuàng)建觀察者,一旦屬性數(shù)據(jù)發(fā)生改變就收到觀察者收到通知,通過KVO再在控制器使用回調(diào)方法處理實(shí)現(xiàn)視圖B的更新;

KVO 的實(shí)現(xiàn)依賴于 Objective-C 強(qiáng)大的 Runtime,key-value observing:監(jiān)聽某個(gè)對(duì)象的某個(gè)屬性發(fā)生變化,當(dāng)發(fā)生變化,觀察者會(huì)調(diào)用相應(yīng)函數(shù),當(dāng)某個(gè)類的屬性對(duì)象第一次被觀察時(shí),系統(tǒng)就會(huì)在運(yùn)行期動(dòng)態(tài)地創(chuàng)建該類的一個(gè)派生類,在這個(gè)派生類中重寫基類中任何被觀察屬性的setter 方法。派生類在被重寫的setter方法內(nèi)實(shí)現(xiàn)真正的通知機(jī)制。

GCD和NSOpertaionQueue:

關(guān)系:①:先搞清兩者的關(guān)系,NSOpertaionQueue用GCD構(gòu)建封裝的,是GCD的高級(jí)抽象!

②:GCD僅僅支持FIFO隊(duì)列,而NSOperationQueue中的隊(duì)列可以被重新設(shè)置優(yōu)先級(jí),從而實(shí)現(xiàn)不同操作的執(zhí)行順序調(diào)整。GCD不支持異步操作之間的依賴關(guān)系設(shè)置。如果某個(gè)操作的依賴另一個(gè)操作的數(shù)據(jù)(生產(chǎn)者-消費(fèi)者模型是其中之一),使用NSOperationQueue能夠按照正確的順序執(zhí)行操作。GCD則沒有內(nèi)建的依賴關(guān)系支持。

③:NSOperationQueue支持KVO,意味著我們可以觀察任務(wù)的執(zhí)行狀態(tài)。

了解以上不同,我們可以從以下角度來回答

性能:①:GCD更接近底層,而NSOperationQueue則更高級(jí)抽象,所以GCD在追求性能的底層操作來說,是速度最快的。這取決于使用Instruments進(jìn)行代碼性能分析,如有必要的話

②:從異步操作之間的事務(wù)性,順序行,依賴關(guān)系。GCD需要自己寫更多的代碼來實(shí)現(xiàn),而NSOperationQueue已經(jīng)內(nèi)建了這些支持

③:如果異步操作的過程需要更多的被交互和UI呈現(xiàn)出來,NSOperationQueue會(huì)是一個(gè)更好的選擇。底層代碼中,任務(wù)之間不太互相依賴,而需要更高的并發(fā)能力,GCD則更有優(yōu)勢

“在大概97%的時(shí)間里,我們應(yīng)該忘記微小的性能提升。過早優(yōu)化是萬惡之源?!敝挥蠭nstruments顯示有真正的性能提升時(shí)才有必要用低級(jí)的GCD。

Block:

block的核心思想:比如我打你一巴掌(發(fā)送消息),然后你說你打到我了(響應(yīng)消息),那我心里就爽了(回調(diào)block).

block的內(nèi)存空間是另外開辟的,所以不會(huì)立馬執(zhí)行block內(nèi)的代碼,block就是代碼塊,什么時(shí)候調(diào)用,什么時(shí)候才響應(yīng)。

注意: __weak typeof(self) weakSelf =self;防止循環(huán)引用。

Delegate:

代理就是雇傭A方和被雇傭B方定一個(gè)協(xié)議:“類名+Delegate”,然后有協(xié)議方法:”代理傳值方法“,讓B用協(xié)議方法傳個(gè)值,A方實(shí)現(xiàn)代理方法,拿到值。這個(gè)代理就完成了。

單例:

簡單的說,單例是一個(gè)特殊的實(shí)例,在單例所屬的類中只存在單例這么一個(gè)實(shí)例,并且單例類似全局變量,在系統(tǒng)任意地方都能訪問單例,就是兩種寫法:

NSUserDefaults:

NSUserDefaults適合存儲(chǔ)輕量級(jí)的本地?cái)?shù)據(jù),一些簡單的數(shù)據(jù)(NSString類型的)例如密碼,網(wǎng)址等,NSUserDefaults肯定是首選,但是如果我們自定義了一個(gè)對(duì)象,對(duì)象保存的是一些信息,這時(shí)候就不能直接存儲(chǔ)到NSUserDefaults了,這個(gè)就是把值存在全局本地,在任意地方都可以調(diào)用,注意的就是鍵值,和增刪。


后續(xù)還會(huì)往更新,都是根據(jù)自己的理解編寫,有不對(duì)的地方歡迎指正。

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

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

  • *面試心聲:其實(shí)這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個(gè)offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,624評(píng)論 30 472
  • 1. 父類實(shí)現(xiàn)深拷貝時(shí),子類如何實(shí)現(xiàn)深度拷貝。父類沒有實(shí)現(xiàn)深拷貝時(shí),子類如何實(shí)現(xiàn)深度拷貝。 1.1 深拷貝同淺拷貝...
    iYeso閱讀 1,973評(píng)論 0 13
  • 父類實(shí)現(xiàn)深拷貝時(shí),子類如何實(shí)現(xiàn)深度拷貝。父類沒有實(shí)現(xiàn)深拷貝時(shí),子類如何實(shí)現(xiàn)深度拷貝。? 深拷貝同淺拷貝的區(qū)別:淺拷...
    JonesCxy閱讀 1,203評(píng)論 1 7
  • 1.屬性readwrite,readonly,assign,retain,copy,nonatomic 各是什么作...
    曾令偉閱讀 1,130評(píng)論 0 10
  • 這是最后一次的新精英培訓(xùn)營培訓(xùn)了,在本來積蓄就不多的情況下,還花了一大筆錢來投資職業(yè)規(guī)劃的學(xué)習(xí),這本身對(duì)于我這個(gè)小...
    蝸牛奕閱讀 478評(píng)論 0 1

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