Blocks是C語言的擴充功能俱萍。用一句話來表示Blocks的擴充功能:帶有自動變量(局部變量)的匿名函數(shù)。
block其實是一個代碼塊告丢,block本身也可以被作為參數(shù)在方法和函數(shù)間傳遞枪蘑,這就給予了block無限的可能。
數(shù)據(jù)傳遞有三種方法:通知岖免,代理岳颇,block.
而對于通知代理block的選擇
1)如果數(shù)據(jù)傳遞兩個對象沒有聯(lián)系。選擇通知颅湘。
2)如果兩個對象有聯(lián)系的話话侧,三個都可以。
3)能用代理的地方 一定也可以用block去代替闯参。
首先說一下通知瞻鹏。
通知 有三個屬性。一個是通知的名稱name鹿寨。 通知的發(fā)布者object.一個是通知要傳遞的數(shù)據(jù)useInfo(可以為nil)新博。
發(fā)布通知的方法:
一般用 [NSNotificationCenter?defaultCenter] 方法來創(chuàng)建通知中心通知中心(NSNotificationCenter)提供了相應(yīng)的方法來幫助發(fā)布通知
- (void)postNotification:(NSNotification*)notification;發(fā)布一個notification通知,可在notification對象中設(shè)置通知的名稱脚草、通知發(fā)布者赫悄、額外信息等
- (void)postNotificationName:(NSString*)aName object:(id)anObject;發(fā)布一個名稱為aName的通知,anObject為這個通知的發(fā)布者
- (void)postNotificationName:(NSString*)aName object:(id)anObject userInfo:(NSDictionary*)aUserInfo;發(fā)布一個名稱為aName的通知馏慨,anObject為這個通知的發(fā)布者埂淮,aUserInfo為額外信息
通知中心(NSNotificationCenter)提供了方法來注冊一個監(jiān)聽通知的監(jiān)聽器(Observer)
- (void)addObserver:(id)observer selector:(SEL)aSelector name (NSString*)aName object:(id)anObject;
observer:監(jiān)聽器,即誰要接收這個通知
Selector:收到通知后写隶,回調(diào)監(jiān)聽器的這個方法同诫,并且把通知對象當做參數(shù)傳入Name:通知的名稱。如果為nil樟澜,那么無論通知的名稱是什么误窖,監(jiān)聽器都能收到這個通知
Object:通知發(fā)布者。如果為anObject和aName都為nil秩贰,監(jiān)聽器都收到所有的通知
第二種注冊監(jiān)聽器的方法
- (id)addObserverForName:(NSString*)name object:(id)obj queue:(NSOperationQueue*)queue usingBlock:(void (^)(NSNotification*note))block;
name:通知的名稱
obj:通知發(fā)布者
block:收到對應(yīng)的通知時霹俺,會回調(diào)這個block
queue:決定了block在哪個操作隊列中執(zhí)行,如果傳nil毒费,默認在當前操作隊列中同步執(zhí)行
取消注冊通知監(jiān)聽器
通知中心不會保留(retain)監(jiān)聽器對象丙唧,在通知中心注冊過的對象,必須在該對象釋放前取消注冊觅玻。否則想际,當相應(yīng)的通知再次出現(xiàn)時培漏,通知中心仍然會向該監(jiān)聽器發(fā)送消息。因為相應(yīng)的監(jiān)聽器對象已經(jīng)被釋放了胡本,所以可能會導(dǎo)致應(yīng)用崩潰
通知中心提供了相應(yīng)的方法來取消注冊監(jiān)聽器
-(void)removeObserver:(id)observer;
-(void)removeObserver:(id)observer name:(NSString*)aName object:(id)anObject;
然后說一下代理牌柄。也是個人最喜歡用的。要分清被代理者和代理者侧甫。
被代理者 有四部分
1)首先定義代理(協(xié)議名稱的命名規(guī)范:控件類名+Delegate)
2)定義代理方法珊佣。(需要傳遞的屬性,還有把自己本身傳過去)這里要注意披粟。代理
3)設(shè)置屬性咒锻。這里要注意代理的屬性要使用weak。
4)在需要傳遞值的地方去調(diào)用代理的方法守屉。(要判斷代理方法是否可以調(diào)用)
在代理者需要三步惑艇。
1)遵守代理協(xié)議。
2)設(shè)置代理拇泛。
3實現(xiàn)代理方法
個人覺得代理比較簡單滨巴。而且比較好理解。非常的規(guī)整碰镜。
下面說一下第三種Block
1)首先要在需要傳遞數(shù)據(jù)的類中定義一個block 屬性為要傳遞數(shù)據(jù)的類型
block的屬性要和NSString 一樣 為copy.
2)在需要傳遞數(shù)據(jù)的地方 實現(xiàn)Blcok方法。首先要判斷block是否可用习瑰。
然后把數(shù)據(jù)回調(diào)绪颖。
3)在需要數(shù)據(jù)的類中定義一個block 把數(shù)據(jù)接過去。
個人理解 block比代理要簡單甜奄。
但是代理會看著比較清晰柠横。讓人理解。
所執(zhí)行的步驟也都差不多课兄。
只是把被代理者中的設(shè)置代理 轉(zhuǎn)變成設(shè)置block接過去牍氛。然后設(shè)置一個Block去接一下回調(diào)的值。