在美团的 block在美团iOS的实践 中提到了comboRequest 一直无法理解和使用场景,帮忙解答下,以下是原文:
函数式编程4
在Lisp中,函数是一等公民,可以随时创建、作为参数传递、作为返回值返回,Objective C在没有block之前,没有类似的机制,有了block,Objective C也就具备了函数式编程的能力,block是对象,有自己的ISA指针,可以随时创建,作为参数传递,作为返回值返回。
先来看看block的经典用法:
[UIView animateWithDuration:0.25 animations:^{
self.view.alpha = 1.0f;
}];
UIView的animateWithDuration:animations:方法的第二个参数是一个block,它把跟动画相关的操作封装起来传递进去,以实现动画效果。
现在让我们发掘一下类似的用法:
[SAKBaseModel comboRequest:^() {
[dealModel fetchDealByID:123456
withFields:nil
completion:^(MTDeal *deal, NSError *error) {
...
}];
[orderModel fetchOrderByID:654321
withDealFields:nil
completion:^(MTOrder *order, NSError *error) {
...
}];
}];
这里我们为SAKBaseModel设计了一个类似于UIView的接口叫comboRequest,它会接受一个block作为参数,在这个block中发出的请求都会作为combo请求的一部分。如果dealModel或者orderModel的任何一个请求不是出现在block中,那么它就是一个普通的请求。这样做的好处是dealModel和orderModel的接口不需要关心自己是不是属于一个combo请求,调用者则可以灵活地调整代码。
那么怎么实现这样的接口呢?还是从UIView上获取灵感。我们知道UIView有个方法setAnimationsEnabled:,实际上SAKBaseModel也可以有这么一个方法:setComboRequestEnabled:,而在comboRequest方法的实现中,在调用传进来的block之前先setComboRequestEnabled:YES,调用完后再恢复为原状态。相应的,在实际的model接口中,检查comboRequest是否为YES,如果是,则把自己作为一个combo请求的一部分,否则正常发出请求即可。
Je n'ai pas regardé leur code source, donc je ne connais pas l'utilisation spécifique, mais si je devine, comboRequest devrait être comme une transaction de base de données. Un groupe de requêtes est compté comme un groupe. Parce qu'il existe de nombreuses situations dans la réalité des affaires, ce qui semble être une opération nécessite en réalité l'envoi de plusieurs requêtes.