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

在美团的 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)
左手右手慢动作

ソースコードを見ていないので具体的な使い方は分かりませんが、推測するに、comboRequestはリクエストの集合をグループとしてカウントするものだと思われます。実際のビジネスでは多くの場面があるため、1 回の操作のように見えても、実際には複数のリクエストを送信する必要があります。

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート