隨著學(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é)果沒有影響