Mam aplikację odtwarzającą muzykę odtwarzającą muzykę za pomocą MPMoviePlayerController. Muszę zaktualizować interfejs użytkownika na podstawie pozycji odtwarzania. Najlepsze, co mogę powiedzieć, nie ma sposobu, aby aktywnie otrzymać te informacje od gracza z wywołaniem zwrotnym lub czymś podobnym, i zasadniczo muszę sondować dla siebie.Jak monitorować postęp odtwarzania MPMoviePlayerController, nie zabijając baterii?
Więc pomyślałem, że użyłbym prostego timera, biegnącego co sekundę, do tego. Kod jest takie:
Gdzieś w kodzie konfiguracji:
[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(updatePlaybackProgressFromTimer:) userInfo:nil repeats:YES];
A potem:
- (void) updatePlaybackProgressFromTimer:(NSTimer *)timer {
if (([UIApplication sharedApplication].applicationState == UIApplicationStateActive) && (player.playbackState == MPMoviePlaybackStatePlaying)) {
CGFloat progress = player.currentPlaybackTime/player.duration;
// do something useful with this info
}
}
Timer prowadzony jest co sekundę, nawet gdy aplikacja jest w tło. Metoda najpierw sprawdza, czy aplikacja jest aktywna, a odtwarzacz odtwarza, a następnie aktualizuje niektóre interfejsy.
Czy w ten sposób ma miejsce żywotność baterii co sekundę? Czy powinienem być bardziej pracowity i próbować oderwać licznik, wchodząc w tło i ponownie aktywując go podczas aktywacji aplikacji? Jestem pewien, że jest jakiś efekt życia na baterii, ale realistycznie, jak poważny jest? Czy jest jakiś inny zalecany sposób robienia tego rodzaju rzeczy?
wystarczy użyć czasomierza jako sugerowane przez @ChrisGummer. Nie ma KVO dla struktury MPMoviePlayerController lub podobnych wywołań zwrotnych. Jest jednak coś takiego dla AVFlayer (AVPlayer) - nadal nie ma potrzeby rezygnacji z timera z podanych powodów. – Till