【问题标题】:Block Callbacks or Protocols to pass information between DataManager and Interactor in VIPER?阻止回调或协议在 VIPER 中的 DataManager 和 Interactor 之间传递信息?
【发布时间】:2016-05-19 12:59:38
【问题描述】:

当使用Objective-C 时,这是使用VIPER 架构模式时将对象从DataManager 传递到Interactor 的首选方法。

特别是使用Block Based CallbacksDataManager Output Protocol

Sample To Do App 来自 Original Mutual Mobile article on VIPER

像这样使用Block Based Callbacks

- (void)todoItemsBetweenStartDate:(NSDate *)startDate endDate:(NSDate *)endDate completionBlock:(void (^)(NSArray *todoItems))completionBlock;

this approach 来自 Brigade Engineering

DataManager 上使用OutputProtocol

[self.interactor foundUser:user];

哪种方法更好,为什么?

注意:我知道在使用 Swift 时,闭包可以使回调方法更加简洁。这个问题直接参考了Objective-C。

【问题讨论】:

    标签: ios objective-c architecture viper-architecture


    【解决方案1】:

    我倾向于尽可能使用输出协议,因为它使测试更容易。当只有一个侦听器时,使用输出协议会更容易。如果有多个监听器,使用回调块更容易,这样对象就不必为每个请求跟踪接收者。

    我发现输出协议更容易测试,因为您可以直接调用侦听器。例如,Presenter 通常实现 Interactor 的输出协议。假设我们的登录交互器输出协议有两种方法:

    - (void)didLogin - (void)loginFailedWithError:(NSError*)error

    在测试 Login Presenter 时,我们将要编写登录成功和登录失败的测试。登录成功测试直接调用[presenter didLogin];,失败测试直接调用[presenter loginFailedWithError:badCredentialsError];

    如果我们使用了回调块,则登录交互器接口可能类似于:

    - (void)loginWithUsername:(NSString*)username password:(NSString*)password result:(void (^)(NSError* error))block;

    在测试 Presenter 时,要测试成功案例,您需要存根 Interactor 登录方法以返回成功,然后在 Presenter 上调用一个方法,强制它向 Interactor 发出登录请求。

    [interactor willSucceed]; [presenter login];

    这会使您的测试对实际意图不太清楚。

    如果您可以设计您的 DataManager API 以支持输出协议,它将使测试更容易。如果没有,我就不用担心了,只需使用回调块即可。

    【讨论】:

      【解决方案2】:

      这不是一刀切,而是:

      1. 如果只有一个回调,则倾向于使用完成块。
      2. 如果存在相关回调系列,则倾向于使用协议/委托。

      您可能还可以使用其他启发式方法(例如,如果可能有一个明显的对象来实现协议并且只需要实现一次,那么委托会更好)。

      您会看到两者都在 Apple 的框架中使用。在块之前,有更多使用目标/选择器的调用——我会说永远不要使用它(改用块)

      【讨论】:

        猜你喜欢
        • 2015-05-17
        • 1970-01-01
        • 2011-04-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-17
        • 1970-01-01
        相关资源
        最近更新 更多