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

在美团的 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教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

reply all(1)
左手右手慢动作

I haven’t looked at their source code, so I don’t know the specific usage, but if I take a guess, comboRequest should be like a database transaction. A group of requests is counted as a group. Because there are many situations in actual business, what seems to be one operation actually requires sending several requests.

Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template