デスクトップで再生しているアプリの音楽をリモートで制御できる iOS アプリを作成しています。
最も困難な問題の 1 つは、「トラッカー」 (現在再生中の曲の時間位置と継続時間を示す) の位置を正しく更新できることです。ここにはいくつかの入力ソースがあります。
- 起動時に、リモートはネットワーク要求を送信して、現在再生中の曲の最初の位置と長さを取得します。
- ユーザーがリモコンを使用してトラッカーの位置を調整すると、曲の位置を変更するために音楽アプリにネットワーク要求が送信されます。
- ユーザーがデスクトップ上のアプリを使用してトラッカーの位置を変更すると、アプリはトラッカーの新しい位置でネットワーク要求をリモートに送信します。
- 曲が再生中の場合、トラッカーの位置は約 0.5 秒ごとに更新されます。
現時点では、トラッカーは「Player」モデルに裏打ちされた 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 を正しく使用するには、ネットワークからの更新が確実に処理されるようにするにはどうすればよいですか?