Tworzę aplikację na iOS, która umożliwia zdalne sterowanie muzyką w aplikacji odtwarzanej na pulpicie.Używanie ReactiveCocoa do śledzenia aktualizacji interfejsu użytkownika za pomocą zdalnego obiektu
Jednym z najtrudniejszych problemów jest poprawne poprawienie pozycji "trackera" (który pokazuje pozycję czasu i czas trwania aktualnie odtwarzanego utworu). Istnieje kilka źródeł danych wejściowych:
- Podczas uruchamiania pilot wysyła żądanie sieciowe, aby uzyskać początkową pozycję i czas trwania aktualnie odtwarzanego utworu.
- Gdy użytkownik dostosuje pozycję trackera za pomocą pilota, wysyła żądanie sieciowe do aplikacji muzycznej, aby zmienić pozycję utworu.
- Jeśli użytkownik używa aplikacji na pulpicie do zmiany pozycji trackera, aplikacja wysyła żądanie sieciowe do pilota z nową pozycją trackera.
- Jeśli utwór jest aktualnie odtwarzany, pozycja trackera jest aktualizowana co 0,5 sekundy.
W tej chwili tracker jest urządzeniem UISlider, które jest wspierane przez model "odtwarzacza". Gdy użytkownik zmienia pozycję na suwaku, aktualizuje model i wysyła żądanie sieciowe, tak jak poniżej:
W NowPlayingViewController.m
[[slider rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(UISlider *x) {
[playerModel seekToPosition:x.value];
}];
[RACObserve(playerModel, position) subscribeNext:^(id x) {
slider.value = player.position;
}];
W 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"]
}
Problem polega na tym, że użytkownik "skrzypi" za pomocą suwaka i umieszcza w kolejce wiele żądań sieciowych, które powracają w różnym czasie. Użytkownik może ponownie przesunąć suwak po otrzymaniu odpowiedzi, przesuwając suwak z powrotem do poprzedniej wartości.
Moje pytanie: Jak prawidłowo korzystać z ReactiveCocoa w tym przykładzie, upewniając się, że aktualizacje z sieci są obsługiwane, ale tylko wtedy, gdy użytkownik nie przesunął suwaka?