在美团的 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请求的一部分,否则正常发出请求即可。
소스 코드를 보지 않아서 구체적인 사용법은 모르지만 추측해 보면 콤보 요청은 데이터베이스 트랜잭션과 같아야 합니다. 실제 비즈니스에는 여러 가지 상황이 있기 때문에 하나의 작업처럼 보이는 작업에도 실제로는 여러 요청을 보내야 합니다.