我的任务是向应用程序添加一些检测逻辑,以跟踪各种 API 调用的延迟。我正在努力想出一种干净、无副作用的方法来向返回 RACSignal(延迟执行 API 调用)的方法添加计时检测。
注意事项
- 使用 ReactiveCocoa @ 1.9.5(目前无法升级)
- 使用Parse-RACExtensions @ 0.0.2
- 我更喜欢在 ViewModel 层设置计时,而不是修改 Parse-RACExtensions。这是因为 VM 有我想要记录的额外信息,例如查询参数,而且我不需要检测每个 API 调用。
- 仅在收到
completed
事件后记录时间 - 本着无痛仪器的精神,调用者的负担应该尽可能小
尝试的解决方案
我唯一能想到的就是创建一个具体的 RACSubscriber 子类来处理定时器逻辑。除了讨厌的子类之外,这显然并不理想,因为它需要一个显式的subscribe:
,而这又需要一个replay
on 源信号。此外,调用者有负担,因为他们必须至少重构以获得信号的临时句柄。
@interface SignalTimer : RACSubscriber
@property (nonatomic) NSDate *startDate;
@end
@implementation SignalTimer
- (void)didSubscribeWithDisposable:(RACDisposable *)disposable
{
[super didSubscribeWithDisposable:disposable];
self.startDate = [NSDate date];
}
- (void)sendCompleted
{
NSTimeInterval duration = [[NSDate date] timeIntervalSinceDate:self.startDate];
NSLog(@"Time elapsed: %f", duration);
[super sendCompleted];
}
@end
用法如下所示:
- (RACSignal*)saveFoo:(Foo*)fooParseObj {
RACSignal *save = [[fooParseObj rac_save] replay]; // Don't forget replay!
[save subscribe:[[SignalTimer alloc] initWithName@"Saving the user's foo object"]];
return save;
}
显然,我对这个实现不满意。
最后的想法
理想情况下,我想要这样的可链接方法,但我不确定如何实现它/是否可以在类别方法中处理冷信号而不会产生讨厌的副作用(比如调用replay
接收器) .
[[[fooParseObj rac_save] logTimingsWithName:@"Saving the user's foo object"] subscribeNext:...];
想法?