Q:

Как правильно использовать NSUserDefaults для хранения времени?

У меня есть аудио плеер. С помощью NSUserDefaults я сохраняю время остановки аудио, чтобы после перегрузки пользователь мог продолжить прослушивание с места остановки в предыдущей сессии. Проблема в том, что если я нажимаю кнопку плей и передвигаю ползунок вручную, время сохраняется. А если нажимаю кнопку плей и ползунок двигается сам, время не сохраняется. Почему?
- (void)viewDidLoad
{
[super viewDidLoad];
if (_index == 0) {
self.audioPlayer = [[AudioPlayer alloc] init];
[self setupAudioPlayer:@"1"];

}
else if (_index == 1) {
self.audioPlayer = [[AudioPlayer alloc] init];
[self setupAudioPlayer:@"2"];
}
else if (_index == 2) {
self.audioPlayer = [[AudioPlayer alloc] init];
[self setupAudioPlayer:@"3"];
}
}
- (BOOL)prefersStatusBarHidden
{
return NO;
}

- (void)setupAudioPlayer:(NSString*)fileName
{

NSString *fileExtension = @"mp3";

[self.audioPlayer initPlayer:fileName fileExtension:fileExtension];
self.currentTimeSlider.maximumValue = [self.audioPlayer getAudioDuration];

self.timeElapsed.text = @"0:00";

self.duration.text = [NSString stringWithFormat:@"-%@",
                      [self.audioPlayer timeFormat:[self.audioPlayer getAudioDuration]]];
_currentTimeSlider.value = [[NSUserDefaults standardUserDefaults] floatForKey:@"time6"];
_timeElapsed.text = [[NSUserDefaults standardUserDefaults] stringForKey:@"time5"];
[self setCurrentTime:self];
//[self playAudioPressed:_playButton];
}

-(void)viewDidDisappear:(BOOL)animated{

[self.audioPlayer pauseAudio];
}

- (IBAction)playAudioPressed:(id)playButton
{

[self.timer invalidate];
if (!self.isPaused) {
    [self.playButton setBackgroundImage:[UIImage imageNamed:@"audioplayer_pause.png"]
                               forState:UIControlStateNormal];

    self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0
                                                  target:self
                                                selector:@selector(updateTime:)
                                                userInfo:nil
                                                 repeats:YES];

    [self.audioPlayer playAudio];
    self.isPaused = TRUE;

} else {
    [self.playButton setBackgroundImage:[UIImage imageNamed:@"audioplayer_play.png"]
                               forState:UIControlStateNormal];

    [self.audioPlayer pauseAudio];
    self.isPaused = FALSE;
}

}

- (void)updateTime:(NSTimer *)timer {

if (!self.scrubbing) {
    self.currentTimeSlider.value = [self.audioPlayer getCurrentAudioTime];
}
self.timeElapsed.text = [NSString stringWithFormat:@"%@",
                         [self.audioPlayer timeFormat:[self.audioPlayer getCurrentAudioTime]]];

self.duration.text = [NSString stringWithFormat:@"-%@",
                      [self.audioPlayer timeFormat:[self.audioPlayer getAudioDuration] - [self.audioPlayer getCurrentAudioTime]]];

if (![self.audioPlayer isPlaying]) {
    [self.playButton setBackgroundImage:[UIImage imageNamed:@"audioplayer_play.png"]
                               forState:UIControlStateNormal];
    [self.audioPlayer pauseAudio];
    self.isPaused = FALSE;

}
[[NSUserDefaults standardUserDefaults] setFloat:_currentTimeSlider.value forKey:@"time6"];
[[NSUserDefaults standardUserDefaults] synchronize];
[[NSUserDefaults standardUserDefaults] setObject:_timeElapsed.text forKey:@"time5"];
[[NSUserDefaults standardUserDefaults] synchronize];
}

- (IBAction)setCurrentTime:(id)scrubber {
[NSTimer scheduledTimerWithTimeInterval:0.01
                                 target:self
                               selector:@selector(updateTime:)
                               userInfo:nil
                                repeats:NO];

[self.audioPlayer setCurrentAudioTime:self.currentTimeSlider.value];
self.scrubbing = FALSE;

}

- (IBAction)userIsScrubbing:(id)sender {
self.scrubbing = TRUE;
}

- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
}

A:

Потому что в таймере у вас repeats:NO, следовательно таймер срабатывает один раз и останавливается. Вообще лучше всего сохранять время не по таймеру а по факту остановки проигрывания, сворачивания приложения или ухода с формы, смотря что Вам больше подходит

