Callback Hell
Block 通常用在处理callback,而我们往往会在callback 里头又做另外一件事情,而这件事情又可能又有另外一个callback,而这个callback 里头要做的事情又有另外一个callback…于是,我们可能会写出这种深度非常深的代码:
[someObject doSomethingWithCallback:^{
[someObject doSomethingWithCallback:^{
[someObject doSomethingWithCallback:^{
[someObject doSomethingWithCallback:^{
[someObject doSomethingWithCallback:^{
[someObject doSomethingWithCallback:^{
}];
}];
}];
}];
}];
}];
这种状况我们称之为Callback Hell—无限延长的Callback地狱,这种现象除了会出现在Objective-C的block之外,也出现在各式各样的程式语言中,尤其是在JavaScript开发中,特别常讨论Callback Hell。为了要解决Callback Hell,从ECMAScript 6开始,就改成使用Promise的写法处理Callback,而像是Parse的Bolts Framework,便是将Promise从JavaScript port到Objective-C中。
使用了Botls Framework 之后,我们可以将各种要非同步执行的工作,包装成BFTask 物例,我们便可以将上面那段code,改写成这个样子:
[[[[someObject doSomething] continueWithBlock:^id(BFTask *task) {
return [someObject doSomething];
}] continueWithBlock:^id(BFTask *task) {
return [someObject doSomething];
}] continueWithBlock:^id(BFTask *task) {
return nil;
}];
虽然一样是callback 之间不断串连,但是在代码中,我们把callback 之间从不断加深的关系,变成了不断往下的关系,也因此变得比较好读。我们在这边不讨论如何包装BFTask 物例,详情请看Bolts Framework 本身的文件。