特别是使用基于块的回调与DataManager输出协议
从Original Mutual Mobile article on VIPER起Sample 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之间传递信息? - 代码日志