簡(jiǎn)介:
首先來概述一下唠亚,Block對(duì)象提供了一個(gè) 特別的(ad hoc)函數(shù),這個(gè)函數(shù)是使用C和C派生語言(如Objective-C和C++)來創(chuàng)建的一個(gè)表達(dá)式持痰,Block對(duì)象在其他語言和環(huán)境中有時(shí)候可以理解為一個(gè)“閉包(closure)”灶搜。除非在某些范圍內(nèi)它們?nèi)菀缀蜆?biāo)準(zhǔn)C表達(dá)式的代碼塊混淆,一般情況下我們可以稱之為“blocks塊”工窍,代碼塊割卖。
一個(gè)Block是一個(gè)匿名的內(nèi)聯(lián)代碼集合體:和函數(shù)一樣擁有參數(shù)類型,有推斷和聲明的返回類型患雏;可以捕獲它的聲明所在相同作用域的狀態(tài)鹏溯,可以和其他定義在相同作用域范圍的blocks進(jìn)行共享更改;可以在相同作用域范圍被銷毀后持續(xù)共享和更改相同作用域范圍的狀態(tài)淹仑。
可以把block作為可執(zhí)行路徑傳遞給其他線程(或者在自己線程內(nèi)傳遞給run loop)丙挽。編譯器和運(yùn)行時(shí)會(huì)在整個(gè)block生命周期中為所有的block引用變量保留一個(gè)副本。
正文:
Block的強(qiáng)大相信可以從本文簡(jiǎn)介中隱隱約約體會(huì)出來匀借,那么本文將從Block作為對(duì)象屬性颜阐,作為方法參數(shù),作為返回值類型三個(gè)方面對(duì)Block的使用來進(jìn)行一個(gè)簡(jiǎn)單的使用與體驗(yàn)示例怀吻,熟悉并且回顧瞬浓,然后深入淺出的從本文開始帶大家進(jìn)入函數(shù)響應(yīng)編程。
Block作為對(duì)象的屬性:
開啟一個(gè)Objective-C項(xiàng)目蓬坡,在此項(xiàng)目中,我們首先來定義一個(gè)類磅叛,此處簡(jiǎn)單定義一個(gè)Dog類屑咳,在Dog類中的.h文件中聲明一個(gè)block屬性如下:
@property(nonatomic,strong)void(^block)();
回到我們的控制器中,倒入頭文件弊琴,創(chuàng)建對(duì)象兆龙,并將一個(gè)新的block賦值給我們Dog中,所調(diào)用的block屬性敲董,并調(diào)用block紫皇,具體實(shí)現(xiàn)如下:
Dog *dog = [[Dog alloc]init];
void(^block_MBXB)() = ^(){
NSLog(@"狗狗不可以隨便拉粑粑");
};
dog.block = block_MBXB;
dog.block();
Block作為方法的參數(shù):
繼續(xù)在Dog類中搞事情,在.h文件中聲明方法腋寨,聲明一個(gè)返回值聪铺,方法名叫eat,參數(shù)名為block萄窜、類型為block的方法(block本身參數(shù)為NSString類型)铃剔,聲明代碼如下:
- (void)eat:(void(^)(NSString*))block;
在.m中實(shí)現(xiàn)撒桨,代碼如下:
- (void)eat:(void(^)(NSString*))block{
block(@"狗糧");
}
此時(shí)在控制器中,就可以來創(chuàng)建對(duì)象键兜,并對(duì)對(duì)象的方法進(jìn)行調(diào)用凤类,代碼如下:
Dog *dog = [[Dog alloc]init];
[dog eat:^(NSString *food) {
NSLog(@"狗狗吃%@,吃了一大盆",food);
}];
Block作為返回值:
返回值,當(dāng)我們使用帶有返回值類型的方法時(shí)普气,當(dāng)然是把定義方法的返回類型谜疤,聲明為block類型,代碼如下:
- (void(^)(int))eatFood;
老套路现诀,在.m中實(shí)現(xiàn)夷磕,代碼如下:
- (void(^)(int))eatFood{
return ^(int food){
NSLog(@"狗狗吃了狗糧%d斤",food);
};
}
在控制器中怎么去處理:
Dog *dog = [[Dog alloc]init];
dog.eatFood(200);
總結(jié):
Block的基本使用和思想需要我們?cè)诰幊痰臅r(shí)候一點(diǎn)一點(diǎn)滲透,體會(huì)他的簡(jiǎn)單粗暴赶盔,體會(huì)實(shí)現(xiàn)思路的跳躍性企锌,慢慢你會(huì)愛上它,在Block當(dāng)作返回值的時(shí)候有很大的延伸性于未,框架Masory,Masory運(yùn)用.語法來掉用方法,OC中用.語法來調(diào)用方法的基本要求,方法必須是get方法,假如說這個(gè)get方法的返回值是一個(gè)block那么就可以用.語法來掉出這個(gè)block撕攒,大家可以發(fā)揮想象
簡(jiǎn)單粗暴介紹RAC,ReactiveCocoa是一個(gè)git開源的函數(shù)響應(yīng)編程框架烘浦,我們用它可以簡(jiǎn)單粗暴的來處理一些事件抖坪,常用類:信號(hào)類(RACSignal)、信號(hào)類的提供者(RACSubject闷叉,當(dāng)然這個(gè)類本身也可以充當(dāng)信號(hào)包括發(fā)送信號(hào))擦俐、協(xié)議(RACSubscriber,訂閱者握侧,發(fā)送信號(hào))蚯瞧、RACDisposable(取消訂閱)
技術(shù)交流q群:150731459,本文demo地址品擎,歡迎大家下載star