IOS開發(fā)之block回調(diào)及鏈?zhǔn)骄幋a原理

隨著學(xué)習(xí)的深入,對block的認(rèn)識也是越來越清晰啊研,就是”一個可以截獲自動變量的匿名函數(shù)“,在一般應(yīng)用上比較順手熙兔,但是在底層的轉(zhuǎn)化上面還在學(xué)習(xí)中悲伶,這里不涉及,只是如標(biāo)題寫的應(yīng)用方面的寫法及中間遇到的問題住涉。

我們先說一下block的回調(diào)

現(xiàn)在有這樣一個需求麸锉,一個人(稱為A)想剪發(fā),讓理發(fā)師(稱為B)幫助他剪發(fā)舆声,剪發(fā)過程B決定花沉。
A.h文件
#import <Foundation/Foundation.h>
@interface PeopleA : NSObject
-(void)doSometing:(void(^)())someOne;
@end

A.m文件
#import "PeopleA.h"

@implementation PeopleA
-(void)doSometing:(void (^)())someOne{
    NSLog(@"A去理發(fā)");
    if (someOne){
        NSLog(@"找到了理發(fā)師");
        someOne();
        NSLog(@"理發(fā)師給我剪完頭發(fā)了");
    }else{
        NSLog(@"沒有找到理發(fā)師");
    }
}
@end


B.h文件
@interface PeopleB : NSObject
-(void)doWork;
@end

B.m文件
#import "PeopleB.h"
#import "PeopleA.h"
@implementation PeopleB
-(void)doWork{
    PeopleA* p = [PeopleA new];
    [p doSometing:^{
        NSLog(@"我現(xiàn)在給A剪發(fā),我給他這樣這樣剪");
        
    }];

}
@end

主調(diào)函數(shù).m文件部分代碼
    PeopleB* p = [PeopleB new];
    [p doWork];

下面是輸出結(jié)果

# A去理發(fā)
# 找到了理發(fā)師
# 我現(xiàn)在給A剪發(fā)媳握,我給他這樣這樣剪
# 理發(fā)師給我剪完頭發(fā)了
1.要注意定義block的語法碱屁,定義的block可以有返回值,可以有參數(shù)蛾找,例如:-(void)doMethod:(int(^)(CGFloat numb, UIImage* image)) block;就是定義了一個沒有返回值的娩脾,參數(shù)為返回值為int類型的block函數(shù),并且block含有numb和image兩個參數(shù)打毛。
2.注意柿赊,在block調(diào)用的時候,看看block是否存在幻枉,有可能沒有實現(xiàn)代碼碰声,用if (block)去判斷,存在再去調(diào)用熬甫,不然會出錯胰挑。
3.block匿名函數(shù)可以做任何變量,可以做函數(shù)參數(shù)椿肩,做屬性瞻颂,做返回值等。

--

現(xiàn)在我們說一下用block實現(xiàn)鏈?zhǔn)骄幋a

關(guān)于鏈?zhǔn)骄幋a郑象,最常見的就是Masonry第三方庫贡这,寫約束真是方便。

[button mas_makeConstraints:^(MASConstraintMaker *make) {
        make.centerX.mas_equalTo(0);
        make.top.mas_equalTo(40);
        make.width.mas_equalTo(100);
    }];

在OC語言中扣唱,點語法藕坯,其實就是調(diào)用屬性的set和get方法团南;我們可以直接設(shè)置為屬性,也可以直接設(shè)置get方法炼彪,屬性系統(tǒng)自動就給添加了吐根。
下面我就寫一個在網(wǎng)上最常見的案例,加減乘除計算的鏈?zhǔn)酱a

Calculator.h文件

@interface Calculator : NSObject
@property(nonatomic)float result;
-(Calculator*(^)(float))add;
-(Calculator*(^)(float))sub;
-(Calculator*(^)(float))div;
-(Calculator*(^)(float))multi;
@end
Calculator.m文件

#import "Calculator.h"

@implementation Calculator
-(instancetype)init{
    if (self = [super init]) {
        self.result = 0;
    }
    return self;
}
-(Calculator*(^)(float))add{
    return ^Calculator*(float num){
        _result += num;
        return self;
    };
}
-(Calculator*(^)(float))sub{
    return ^Calculator*(float num){
        _result -= num;
        return self;
    };
}
-(Calculator*(^)(float))div{
    return ^Calculator*(float num){
        if (num == 0){
            NSAssert(num != 0, @"是0辐马,不可以做被除數(shù)");
        }
        _result = _result / num;
        return self;
    };
}
-(Calculator*(^)(float))multi{
    return ^Calculator*(float num){
        _result = _result * num;
        return self;
    };
}
@end

主調(diào)函數(shù)的調(diào)用部分代碼
Calculator* cal = [Calculator new];
    cal.add(1).add(12).sub(1).div(1).multi(10);
    NSLog(@"%f",cal.result);



調(diào)用的結(jié)果為

# 120.000000
這段鏈?zhǔn)酱a拷橘,主要是說明首先是用()調(diào)用,需要返回block喜爷,接著.鏈?zhǔn)秸{(diào)用冗疮,在返回block調(diào)用后需要返回自己(self)
有時候在Masonry看到and,with關(guān)鍵子檩帐,其實就是一個block什么都不做术幔,直接返回自己(self)即如下:
-(Calculator*(^)())and{
    return ^Calculator*(){
        return self;
    };
}
-(Calculator*(^)())with{
    return ^Calculator*(){
        return self;
    };
}
  //代碼鏈加上上述代碼,對代碼結(jié)果沒有影響

上面就是今天分享的內(nèi)容湃密,代碼測試沒有問題诅挑,大概做法和思路就是這樣,又發(fā)現(xiàn)問題可以在下面反饋泛源,謝謝拔妥!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市达箍,隨后出現(xiàn)的幾起案子没龙,更是在濱河造成了極大的恐慌,老刑警劉巖缎玫,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件硬纤,死亡現(xiàn)場離奇詭異,居然都是意外死亡碘梢,警方通過查閱死者的電腦和手機咬摇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進(jìn)店門伐蒂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來煞躬,“玉大人,你說我怎么就攤上這事逸邦《髋妫” “怎么了?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵缕减,是天一觀的道長雷客。 經(jīng)常有香客問我,道長桥狡,這世上最難降的妖魔是什么搅裙? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任皱卓,我火速辦了婚禮,結(jié)果婚禮上部逮,老公的妹妹穿的比我還像新娘娜汁。我一直安慰自己,他們只是感情好兄朋,可當(dāng)我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布掐禁。 她就那樣靜靜地躺著,像睡著了一般颅和。 火紅的嫁衣襯著肌膚如雪傅事。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天峡扩,我揣著相機與錄音蹭越,去河邊找鬼。 笑死教届,一個胖子當(dāng)著我的面吹牛般又,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播巍佑,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼茴迁,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了萤衰?” 一聲冷哼從身側(cè)響起堕义,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎脆栋,沒想到半個月后倦卖,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡椿争,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年怕膛,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片秦踪。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡褐捻,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出椅邓,到底是詐尸還是另有隱情柠逞,我是刑警寧澤,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布景馁,位于F島的核電站板壮,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏合住。R本人自食惡果不足惜绰精,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一撒璧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧笨使,春花似錦沪悲、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至最爬,卻和暖如春涉馁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背爱致。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工烤送, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人糠悯。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓帮坚,卻偏偏與公主長得像,于是被迫代替她去往敵國和親互艾。 傳聞我的和親對象是個殘疾皇子试和,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,514評論 2 348

推薦閱讀更多精彩內(nèi)容