- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我的任务是向应用添加一些检测逻辑以跟踪各种 API 调用的延迟。我正在努力想出一种干净、无副作用的方法来向返回 RACSignal(延迟执行 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/
例如,我目前的实现如下: - (RACSignal *)getPlaylist { return [RACSignal createSignal:^RACDisposable *(id subsc
使用 ReactiveCocoa,我确定有比这更好的方法吗? RACSignal *crashSignal = [cancelSignal tryMap:^id(id value, NSError *
rac_textSignal-Implementation使用“defer”在“self”上返回 RACSignal。这是什么原因? 这是实现: - (RACSignal *)rac_textSign
我有一个简单的 subscribeNext: error: 链,如: [[self.viewModel signal] subscribeNext:^(id x) { NSLog(@"succ
我已将一些 racsignals 合并为一个 Racsignal。并订阅合并信号。现在,如果我合并的任何信号发送错误事件,所有合并的信号都会被处理掉。如果任何信号失败,我希望所有信号继续执行。 最佳答
我有一个属性,recording,如果 UILongPressGestureRecognizer 处于状态 UIGestureRecognizerStateBegan 或UIGestureRecogn
我目前正在开发 WatchKit 应用程序,但我目前遇到此给定方法的问题: - (void)application:(UIApplication*)application handleWatchKit
我正在尝试使用 ReactiveCocoa 的 RACSignal 类的间隔方法。以下代码在 1 秒后每秒运行一次。但我希望它每秒都能立即运行。什么是最好的方法? @weakify(self); [[
我有一个简单的问题,但找不到好的解决方案。 我有一个发送字符串的信号,然后是一个 map。 map 将字符串转换为 JSON。 可能会出现字符串格式错误导致JSON解析器解析失败的情况。 [strin
我是 Reactive Cocoa 的新手。我正在尝试通过信号设置按钮启用属性。我有以下代码片段可以正常工作: RACSignal *formValid = [RACSignal
我的 ViewController 包含一个 UISearchBar 并实现了 UISearchBarDelegate 协议(protocol)。我为 searchBartextDidChange:
我也在我的 iOS 中使用 MVVM 范例和 RACSignal。到目前为止,一切进展顺利。但是,我在订阅信号时遇到了问题。在第一次订阅时一切正常。但是,进一步的订阅不会。 代码 在我的 viewMo
我正在尝试使用 react 性 cocoa 进行并发加载,我的实现使用了已弃用的缓冲方法。我如何才能在不损失代码清晰度的情况下更改它? 输入:仅发送一次“下一步”并完成/错误的加载信号数组 期望的结果
我对 ReactiveCocoa 比较陌生,想知道如何将一系列 REST GET 调用链接在一起,以便它们按顺序执行。如果其中一个调用出错,则整个过程将回滚。 所以我正在使用 pod 'AFNetwo
例如: 在一个 Controller 中实现 func sendSuccessOrNot()->RACSignal { // code here } 在另一个 Controller 中,调用那个信号
我目前正在迈出 ReactiveCocoa 的第一步,我经历了一些陡峭的学习曲线来理解原则。 无论如何,这就是我已经想到的。 我将 NSArray 属性绑定(bind)到 RACSignal,以便能够
我的任务是向应用添加一些检测逻辑以跟踪各种 API 调用的延迟。我正在努力想出一种干净、无副作用的方法来向返回 RACSignal(延迟执行 API 调用)的方法添加计时检测。 注意事项 使用 Rea
我正在编写一些通过 websockets 与远程 API 交互的代码。我的数据层负责建立和监控 websocket 连接。它还包含应用程序可以用来对要发送的 websocket 消息进行排队的方法。应
我正在尝试返回一个可以在 Objective-C 代码中使用的 RACSignal,我尝试了各种方法。例如: @objc class func getPosts() -> RACSignal
我正在尝试监听位置更新和错误(通过 CLLocationManagerDelegate),并支持跟踪错误但将它们从最终信号中过滤掉并保持其事件的能力。 当我订阅位置信号时(通过 ReactiveCoc
我是一名优秀的程序员,十分优秀!