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 本身的文件。

results matching ""

    No results matching ""