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