ios - 如何理解美团的comboRequest ?
高洛峰
高洛峰 2017-04-17 17:59:27
0
1
394

在美团的 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请求的一部分,否则正常发出请求即可。

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

모든 응답(1)
左手右手慢动作

소스 코드를 보지 않아서 구체적인 사용법은 모르지만 추측해 보면 콤보 요청은 데이터베이스 트랜잭션과 같아야 합니다. 실제 비즈니스에는 여러 가지 상황이 있기 때문에 하나의 작업처럼 보이는 작업에도 실제로는 여러 요청을 보내야 합니다.

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿