KVO,NSNotification,delegate及block差別?
KVO就是cocoa架構實作的觀察者模式,一般同KVC搭配使用,通過KVO可以監測一個值得變化,比如View的高度變化。是一對多的關系,一個值得變化會通知所有的觀察者。
NSNotification是通知,也是一對多的使用場景。在某些情況下,KVO和NSNotification是一樣的,都是狀态變化之後告知對方。NSNotification的特點,就是需要被觀察者先主動發出通知,然後觀察者注冊監聽後再來進行相應,比KVO多了發送通知的異步,但是其優點是監聽不局限于屬性的變化,還可以對多種多樣的狀态變化進行監聽,監聽範圍廣,使用也更靈活。
delegate是代理,就是我不想做的事情交給别人做。比如狗需要吃飯,就通過delegate通知主人,主人就會給他做飯、盛飯、倒水,這些操作,這些狗都不要關心,隻需要調用delegate(代理人)就可以了,由其他類完成所需要的操作。是以delegate是一對一關系。
block是delegate的另一種形式,是函數式程式設計的一種形式。使用場景跟delegate一樣,相比delegate更靈活,而且代理的實作更直覺。
KVO一般的使用場景是資料,需求是資料變化,比如股票價格變化,我們一般使用KVO(觀察者模式)。delegate一般的使用場景是行為,需求是需要别人幫我做一件事情,比如買賣股票,我們一般使用delegate。Notification一般是進行全局通知,比如利好消息一出,通知大家去買入。delegate是強關聯,就是委托和代理雙方互相知道,你委托别人買股票你就需要知道經紀人,經紀人也不要知道自己的顧客。Notification是弱關聯,利好消息已發出,你不需要知道是誰發的也可以做出相應的反應,同理發消息的人也不需要知道接收的人也可以正常發出的消息。