詳解關(guān)于Cocoa編程模塊間協(xié)作
Cocoa編程模塊間協(xié)作是本文要介紹的內(nèi)容,在cocoa編程中,我們經(jīng)常會遇到delegate、Target-Action、notification等等這些方法,我覺得從某種角度看,可以將這些方法總結(jié)在一起,它們就是為不同模塊間提供協(xié)作的方法,這種協(xié)作在這里我把它理解為是“回調(diào)”,其實"回調(diào)"二字在這里更多是借用,并沒有認(rèn)真地去考究過這些正是一堆回調(diào)函數(shù),純粹是覺得挺像,感覺用來說明問題挺方便,所以就借用一下,應(yīng)用層我們常見的"回調(diào)"就有以下幾類:
***:當(dāng)然是如雷貫耳的delegate,這個沒什么好說的,教程和文檔說得夠權(quán)威仔細(xì)了,它主要在"父子"實例中會常被用到;
第二:這種方式比較常見,但卻未必會想到它其實也可以理解為是一種“回調(diào)”,這就是Target-Action模式;
第三:最任勞任怨的NSNotificationCenter,它以你最舒服的方式提供很令你滿意的服務(wù),它有三個關(guān)鍵詞比較重要,observer、sender和name,observer就是notification的接受者,在"注冊method"中會碰到它,經(jīng)常是self,我也建議是這樣,自己的notification就應(yīng)該自己去注冊。
sender在設(shè)置"發(fā)送method"中(postNotificationName:object:和postNotificationName:object:userInfo:)的object參數(shù)時會見到,這個參數(shù)非常重要,它直接影響對NSNotificationCenter 使用的質(zhì)量,sender是什么意思,就是notification的"簽名",當(dāng)在注冊method中我們可以指定僅接受哪個sender的notification,那么center就是靠"發(fā)送method"時的object這個參數(shù)所傳的"簽名"來決定怎么發(fā)的,name比較簡單,相當(dāng)于標(biāo)題,observer可以而且必須指定接受哪些name的notification,不同name其含義自然不同,在關(guān)系比較遠(yuǎn)的模塊間,NSNotificationCenter很實用;
第四:KVO(Key-Value Observing),這個用得比較少,當(dāng)B模塊對A模塊的屬性狀態(tài)感興趣時,可以使用這種方法,參考文檔:Key-Value Observing Quick Start;
第五:一個例子就明白了,它其實就是直接將一個對象的指針和方法作為參數(shù)傳給另一個對像,讓另一個對象來調(diào)用自己,就是這一句:
- UIImageWriteToSavedPhotosAlbum(originalImage, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);
- #pragma mark -
- #pragma mark UIImagePickerController delegate
- - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)Info {
- UIImage *originalImage = [Info objectForKey:UIImagePickerControllerOriginalImage];
- if(nil != originalImage)
- {
- UIImageWriteToSavedPhotosAlbum(originalImage, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);
- }
- ...
- }
- - (void) image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo {
- ...
- }
小結(jié):詳解關(guān)于Cocoa編程模塊間協(xié)作的內(nèi)容介紹完了,以上就是我的一點(diǎn)小小的總結(jié),這些方法在模塊間的協(xié)作可能會經(jīng)常使用到的,希望對開始學(xué)習(xí)cocoa編程的朋友有所幫助!