【发布时间】:2013-12-13 16:03:04
【问题描述】:
我正在制作一个 iOS 应用程序,它可以让你在桌面上播放的应用程序中远程控制音乐。
最难的问题之一是能够正确更新“跟踪器”的位置(显示当前播放歌曲的时间位置和持续时间)。这里有几个输入来源:
- 在启动时,遥控器发送网络请求以获取当前播放歌曲的初始位置和持续时间。
- 当用户使用遥控器调整跟踪器的位置时,它会向音乐应用发送网络请求以更改歌曲的位置。
- 如果用户使用桌面上的应用程序来更改跟踪器的位置,应用程序会使用跟踪器的新位置向远程发送网络请求。
- 如果歌曲当前正在播放,跟踪器的位置每 0.5 秒左右更新一次。
目前,跟踪器是一个由“播放器”模型支持的 UISlider。每当用户更改滑块上的位置时,它都会更新模型并发送网络请求,如下所示:
在 NowPlayingViewController.m 中
[[slider rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(UISlider *x) {
[playerModel seekToPosition:x.value];
}];
[RACObserve(playerModel, position) subscribeNext:^(id x) {
slider.value = player.position;
}];
在 PlayerModel.m 中:
@property (nonatomic) NSTimeInterval position;
- (void)seekToPosition:(NSTimeInterval)position
{
self.position = position;
[self.client newRequestWithMethod:@"seekTo" params:@[positionArg] callback:NULL];
}
- (void)receivedPlayerUpdate:(NSDictionary *)json
{
self.position = [json objectForKey:@"position"]
}
问题是当用户“摆弄”滑块时,将许多网络请求排队,这些请求都在不同的时间返回。当收到响应时,用户可能会再次移动滑块,将滑块移回之前的值。
我的问题:我如何在这个例子中正确使用 ReactiveCocoa,确保处理来自网络的更新,但前提是用户没有移动滑块?
【问题讨论】:
标签: ios objective-c cocoa-touch uikit reactive-cocoa