gpt4 book ai didi

ios - 检测 RACSignal 的最佳实践

转载 作者:可可西里 更新时间:2023-11-01 03:33:48 25 4
gpt4 key购买 nike

我的任务是向应用添加一些检测逻辑以跟踪各种 API 调用的延迟。我正在努力想出一种干净、无副作用的方法来向返回 RACSignal(延迟执行 API 调用)的方法添加计时检测。

注意事项

  • 使用 ReactiveCocoa @ 1.9.5(目前无法升级)
  • 使用Parse-RACExtensions @0.0.2
  • 我更愿意在 ViewModel 层设置计时,而不是修改 Parse-RACExtensions。这是因为虚拟机有额外的信息我想记录,比如查询参数,我不需要检测每个 API 调用。
  • 仅在收到 completed 事件后记录时间
  • 本着无痛检测的精神,调用者的负担应该尽可能小

尝试的解决方案

我唯一能想到的就是创建一个具体的 RACSubscriber 子类来处理计时器逻辑。除了令人讨厌的子类之外,这显然不是理想的,因为它需要显式 subscribe:,而这又需要对源信号进行 replay。此外,调用者有负担,因为他们至少必须重构才能获得信号的临时句柄。

@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:...];

想法?

最佳答案

所以我认为我让这条路变得比需要的更难。以下类别解决方案似乎更为惯用,但我希望收到任何反馈。

@interface RACSignal (Timing)

- (instancetype)logTimingWithName:(NSString*)name;

@end

@implementation RACSignal (Timing)

- (instancetype)logTimingWithName:(NSString*)name
{
return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {

NSDate* startDate = [NSDate date];

return [self subscribeNext:^(id x) {
[subscriber sendNext:x];
} error:^(NSError *error) {
[subscriber sendError:error];
} completed:^{
NSTimeInterval duration = [[NSDate date] timeIntervalSinceDate:startDate];
NSLog(@"%@: %f sec", name, duration);

[subscriber sendCompleted];
}];
}];
}

@end

关于ios - 检测 RACSignal 的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20862687/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com