Realizzo un'app per iOS che consente di controllare a distanza la musica in un'app in esecuzione sul desktop.Utilizzo di ReactiveCocoa per tenere traccia degli aggiornamenti dell'interfaccia utente con un oggetto remoto
Uno dei problemi più difficili è riuscire ad aggiornare correttamente la posizione del "tracker" (che mostra la posizione temporale e la durata della canzone attualmente in riproduzione). Esistono diverse fonti di input:
- All'avvio, il telecomando invia una richiesta di rete per ottenere la posizione iniziale e la durata della canzone attualmente in riproduzione.
- Quando l'utente regola la posizione del localizzatore tramite il telecomando, invia una richiesta di rete all'app musicale per modificare la posizione della canzone.
- Se l'utente utilizza l'app sul desktop per modificare la posizione del tracker, l'app invia una richiesta di rete al telecomando con la nuova posizione del tracker.
- Se la canzone è attualmente in riproduzione, la posizione del tracker viene aggiornata ogni 0,5 secondi circa.
Al momento, il tracker è un UISlider supportato da un modello "Player". Ogni volta che l'utente cambia la posizione sul cursore, aggiorna il modello e invia una richiesta di rete, in questo modo:
In NowPlayingViewController.m
[[slider rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(UISlider *x) {
[playerModel seekToPosition:x.value];
}];
[RACObserve(playerModel, position) subscribeNext:^(id x) {
slider.value = player.position;
}];
In 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"]
}
Il problema è quando un utente "armeggia" con il dispositivo di scorrimento e accoda un numero di richieste di rete che ritornano tutte in momenti diversi. L'utente potrebbe aver spostato di nuovo il cursore quando viene ricevuta una risposta, riportando il cursore su un valore precedente.
La mia domanda: come utilizzare correttamente ReactiveCocoa in questo esempio, assicurando che gli aggiornamenti dalla rete siano gestiti, ma solo se l'utente non ha spostato il cursore da allora?