前言,在上篇文章Block相關(guān)(一),中介紹了Block相關(guān)的基礎(chǔ)知識(shí),包括Block介紹、基礎(chǔ)語(yǔ)法、使用情況等。這篇我們將介紹Blcok的實(shí)戰(zhàn)使用環(huán)境,畢竟語(yǔ)言是抽象的,代碼應(yīng)用才是具體的。
頁(yè)面值傳遞
我們知道在父子控制器傳遞值的時(shí)候,為了解耦和合理的進(jìn)行值傳遞,我們一般會(huì)用代理或者Block。Block的靈活性在值傳遞的時(shí)候能很好的體現(xiàn)。這里我們用一個(gè)簡(jiǎn)單的通訊錄添加聯(lián)系人功能作為演示,效果如下:

反向傳值.gif
功能主要實(shí)現(xiàn)了,在添加聯(lián)系人頁(yè)面添加一個(gè)聯(lián)系人,然后保存,并在通訊錄首頁(yè)展示,實(shí)現(xiàn)代碼如下:
在新建聯(lián)系人頁(yè)面聲明一個(gè)block成員變量:(Person為聯(lián)系人模型)
/* 保存聯(lián)系人的block */
@property (nonatomic, strong) void (^saveBlock)(Person *);
在通訊錄首頁(yè)跳轉(zhuǎn)到新建聯(lián)系人頁(yè)面時(shí)給block賦值:
NewViewController *newVC = segue.destinationViewController;// 新建聯(lián)系人控制器
__weak typeof(self) weakSelf = self;
/* 給block賦值 */
newVC.saveBlock = ^(Person *person) {
[weakSelf.personArr addObject:person];
[weakSelf.tableView reloadData];
};
在保存聯(lián)系人時(shí)執(zhí)行block:
// 點(diǎn)擊保存按鈕執(zhí)行操作
- (IBAction)save:(UIButton *)sender {
Person *person = [[Person alloc] init];
person.name = self.personNamelabel.text;
person.phoneNumber = self.personNumberlabel.text;
!self.saveBlock ? : self.saveBlock(person);// 執(zhí)行block
// 返回通訊錄首頁(yè)
[self.navigationController popViewControllerAnimated:YES];
}
這樣一來就實(shí)現(xiàn)了,子頁(yè)面向父頁(yè)面逆向傳值。原理有點(diǎn)像代理。父頁(yè)面將拿到數(shù)據(jù)后要執(zhí)行的操作封裝到block中,由于ARC環(huán)境下,Block會(huì)復(fù)制到堆上,block對(duì)通訊錄頁(yè)面有強(qiáng)引用關(guān)系,所以新建頁(yè)面執(zhí)行block時(shí)候,block里面代碼就可以拿到通訊錄頁(yè)面更新數(shù)據(jù)。