這里集成了以上所有的小例子,幫助理解常熙,先上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ā)生改變就收到觀察者收到通知呼奢,通過(guò)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)茶敏。
了解以上不同,我們可以從以下角度來(lái)回答
性能:①:GCD更接近底層缚俏,而NSOperationQueue則更高級(jí)抽象惊搏,所以GCD在追求性能的底層操作來(lái)說(shuō),是速度最快的忧换。這取決于使用Instruments進(jìn)行代碼性能分析恬惯,如有必要的話
②:從異步操作之間的事務(wù)性,順序行亚茬,依賴關(guān)系酪耳。GCD需要自己寫更多的代碼來(lái)實(shí)現(xiàn),而NSOperationQueue已經(jīng)內(nèi)建了這些支持
③:如果異步操作的過(guò)程需要更多的被交互和UI呈現(xiàn)出來(lái)刹缝,NSOperationQueue會(huì)是一個(gè)更好的選擇碗暗。底層代碼中,任務(wù)之間不太互相依賴梢夯,而需要更高的并發(fā)能力言疗,GCD則更有優(yōu)勢(shì)
“在大概97%的時(shí)間里,我們應(yīng)該忘記微小的性能提升颂砸。過(guò)早優(yōu)化是萬(wàn)惡之源噪奄。”只有Instruments顯示有真正的性能提升時(shí)才有必要用低級(jí)的GCD人乓。
Block:
block的核心思想:比如我打你一巴掌(發(fā)送消息),然后你說(shuō)你打到我了(響應(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è)代理就完成了蝠猬。
單例:
簡(jiǎn)單的說(shuō),單例是一個(gè)特殊的實(shí)例统捶,在單例所屬的類中只存在單例這么一個(gè)實(shí)例榆芦,并且單例類似全局變量,在系統(tǒng)任意地方都能訪問(wèn)單例喘鸟,就是兩種寫法:
NSUserDefaults:
NSUserDefaults適合存儲(chǔ)輕量級(jí)的本地?cái)?shù)據(jù)匆绣,一些簡(jiǎn)單的數(shù)據(jù)(NSString類型的)例如密碼,網(wǎng)址等什黑,NSUserDefaults肯定是首選崎淳,但是如果我們自定義了一個(gè)對(duì)象,對(duì)象保存的是一些信息愕把,這時(shí)候就不能直接存儲(chǔ)到NSUserDefaults了拣凹,這個(gè)就是把值存在全局本地,在任意地方都可以調(diào)用恨豁,注意的就是鍵值嚣镜,和增刪。
后續(xù)還會(huì)往更新橘蜜,都是根據(jù)自己的理解編寫菊匿,有不對(duì)的地方歡迎指正。