ios – 阻止回调或协议在VIPER中的DataManager和Interactor之间传递信息?

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

特别是使用基于块的回调与DataManager输出协议

Original Mutual Mobile article on VIPERSample To Do App

像这样使用基于块的回调

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

来自Brigade Engineering的this approach

利用DataManager上的OutputProtocol

[self.interactor foundUser:user];

哪种方法更好,为什么?

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

最佳答案
我倾向于在可能的情况下使用输出协议,因为它使测试更容易.当只有一个侦听器时,更容易使用输出协议.如果有多个侦听器,则更容易使用回调块,因此对象不必跟踪每个请求的接收器.

我发现输出协议更容易测试,因为你可以直接调用监听器.例如,Presenter通常实现Interactor的输出协议.假设我们的Login Interactor输出协议有两种方法:

– (void)didLogin
– (void)loginFailedWithError:(NSError *)错误

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

相反,如果我们使用了回调块,则登录交互器界面可能如下所示:

– (void)loginWithUsername:(NSString *)用户名密码:(NSString *)密码结果:(void(^)(NSError * error))block;

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

[interctor willSucceed];
[演示者登录];

这使得您的测试不太清楚实际意图.

如果您可以设计DataManager API以支持输出协议,则可以使测试更容易.如果没有,我不会担心它,只需使用回调块.

转载注明原文:ios – 阻止回调或协议在VIPER中的DataManager和Interactor之间传递信息? - 代码日志