仪器RACSignal的最佳实践

 快乐星期八2012_846 发布于 2023-02-07 12:05

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

注意事项

使用ReactiveCocoa @ 1.9.5(目前无法升级)

使用Parse-RACExtensions @ 0.0.2

我宁愿在ViewModel层设置时序,而不是修改Parse-RACExtensions.这是因为VM有我想记录的额外信息,比如查询参数,而且我不需要每个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:...];

思考?

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有