当使用Objective-C
时,这是在利用DataManager
体系结构模式时将对象从Interactor
传递到VIPER
的首选方法。
特别是Block Based Callbacks
与DataManager 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来支持输出协议,那么它将使测试变得更加容易。如果没有,我不会担心,只需使用回调块即可。