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)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容