我正在製作一個iOS應用程序,它可以讓您遠程控制桌面上播放的應用程序中的音樂。使用ReactiveCocoa跟蹤UI更新與遠程對象
最難的問題之一是能夠正確更新「跟蹤器」(顯示當前播放歌曲的時間位置和持續時間)的位置。這裏有幾種輸入源:
- 在啓動時,遠程發送網絡請求以獲取當前播放歌曲的初始位置和持續時間。
- 當用戶使用遙控器調整跟蹤器的位置時,它會向音樂應用發送網絡請求以更改歌曲的位置。
- 如果用戶使用桌面上的應用程序更改跟蹤器的位置,應用程序將向跟蹤器的新位置發送網絡請求。
- 如果歌曲正在播放,則跟蹤器的位置每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,確保來自網絡的更新得到處理,但只有在用戶還沒有移動滑塊後?