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

特别是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;
而rigt_a来自Brigade Engineering

OutputProtocol上使用DataManager[self.interactor foundUser:user];
哪种方法更好,为什么呢?

注意:我知道使用Swift时,闭包可以使回调方法更加整洁。这个问题直接涉及到Objective-C。

最佳答案

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

我发现输出协议更易于测试,因为您可以直接调用侦听器。例如,演示者通常实现交互器的输出协议。假设我们的Login Interactor输出协议有两种方法:
- (void)didLogin- (void)loginFailedWithError:(NSError*)error
在测试Login Presenter时,我们将要编写有关登录成功和登录失败的测试。登录成功的测试可以直接调用[presenter didLogin];,登录失败的测试可以直接调用[presenter loginFailedWithError:badCredentialsError];

相反,如果我们使用了回调块,则Login Interactor接口可能类似于:
- (void)loginWithUsername:(NSString*)username password:(NSString*)password result:(void (^)(NSError* error))block;
在测试演示者时,要测试成功案例,您将需要对Interactor登录方法进行打桩以返回成功,然后在Presenter上调用一个方法,强制其向Interactor发出登录请求。
[interactor willSucceed];[presenter login];
这会使您的测试不清楚实际意图。

如果您可以设计DataManager API来支持输出协议,那么它将使测试变得更加容易。如果没有,我不会担心,只需使用回调块即可。

09-10 19:57