一 Block基本常識
1.聲明block
聲明沒有參數(shù)沒有返回值block
void(^block1)(); block1就是該block數(shù)據(jù)類型的變量名
有返回值有參數(shù)
int(^block2)(int);
2.定義block
2.1 沒有參數(shù),沒有返回值block的定義
void(^block1)() = ^{ };
2.2 有參數(shù),有返回值block的定義
int(^block2)(int) = ^int(int a){ return a }; == int(^block2)(int) = ^(int a){ return a };
= 后面的返回值類型可以省略
注意:如果block有返回值,那么代碼塊中一定要有return
3.block作用
封裝(保存)代碼塊
4.block調(diào)用
用變量名+()就可以調(diào)用
如果有參數(shù),()內(nèi)一定要寫上 參數(shù)的變量名
5.block類型
block的數(shù)據(jù)類型去掉變量名 就是 block的類型
例如:void(^block1)()的block類型為 void(^)()
int(^block2)(int)的Block類型為 : int(^)(int)
6.生成block類型的快捷方式
輸入inline + 回車 就會彈出block類型的定義模板
<#returnType#>(^<#blockName#>)(<#parameterTypes#>) = ^(<#parameters#>) { <#statements#>
};
注意:蘋果文檔里面說明block是一個對象

二 block的使用場景
1.block可以作為方法的參數(shù)去使用
1.1 為什么把block作為參數(shù)使用?
封裝一個類,有些事情方法內(nèi)部不能決定,需要外界決定,那么可以提供block給外界 , 通過block外界就可以把想做的事情傳進來
經(jīng)典案例:動畫 和 AFN發(fā)送網(wǎng)絡(luò)請求
動畫: UIView animateWithDuration:<#(NSTimeInterval)#> animations:<#^(void)animations#>
[UIView animateWithDuration:2.0 animations:^{
//在這里寫(外界)想做的事情
}];
AFN:
mgr GET:<#(nonnull NSString *)#> parameters:<#(nullable id)#> progress:<#^(NSProgress * _Nonnull downloadProgress)downloadProgress#> success:<#^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject)success#> failure:<#^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error)failure#>
[mgr GET:XMGBaseUrl parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
//這里寫(外界)想做的事情
//參數(shù)的作用:內(nèi)部得到的數(shù)據(jù),想要傳給外界,就可以通過block的參數(shù)來傳遞
//內(nèi)部對參數(shù)賦值,在外界通過這個參數(shù) 就能夠拿到這個值
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
//這里寫(外界)想做的事情
}];
2.block作為成員變量使用
為什么把block作為成員變量:一個類中,有些事情需要外界來決定,就可以提供一個block成員變量,外界通過對blcok賦值,就能把想做的事情傳進來
不帶參數(shù)的block成員變量
聲明 @property (nonatomic, copy)void(^task)();
給block賦值 (set方法)
XTSettingArrowItem *item1 = [XTSettingArrowItem rowItemWithImage:nil title:@"使用兌換碼" subTitle:nil];
item1.task = ^{
UIAlertView *alertV = [[UIAlertView alloc] initWithTitle:@"清理緩存" message:@"幫你清理12M" delegate:nil cancelButtonTitle:@"取消" otherButtonTitles:@"確定", nil];
[alertV show];
};
帶參數(shù)的block成員變量
聲明 @property(nonatomic,copy) void(^task)(NSIndexPath *indexPath) ;
給block賦值 (set方法)
XTSettingArrowItem *item1 = [XTSettingArrowItem rowItemWithImage:nil title:@"使用兌換碼" subTitle:@"23:00"];
item1.task= ^(NSIndexPath *indexPath){
UITextField *textF = [[UITextField alloc] init];
[textF becomeFirstResponder];
//添加到當(dāng)前點擊的Cell上.
//獲取當(dāng)前點擊的是哪個Cell.
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
[cell addSubview:textF];
};