I have a music player. It is necessary that he remembers the time of the last stop of the audio and in the next session the user could continue listening from the place of the stop. I do this with NSUserDefaults . Do I need to memorize the stop time with NSUserDefaults or is there a better solution for my problem?

 - (void)viewDidLoad { if (_index == 0) { self.audioPlayer = [[AudioPlayer alloc] init]; [self setupAudioPlayer:@"1"]; _timeElapsed.text = [[NSUserDefaults standardUserDefaults] stringForKey:@"time0"]; _currentTimeSlider.value = [[NSUserDefaults standardUserDefaults] floatForKey:@"time 0"]; [self setCurrentTime:self]; } } - (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]]]; [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:@"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:@"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:@"play.png"] forState:UIControlStateNormal]; [self.audioPlayer pauseAudio]; self.isPaused = FALSE; } if (self.isPaused == TRUE) { if (_index == 0) { [[NSUserDefaults standardUserDefaults] setObject:_duration.text forKey:@"timeImage0"]; [[NSUserDefaults standardUserDefaults] synchronize]; [[NSUserDefaults standardUserDefaults] setObject:_timeElapsed.text forKey:@"time0"]; [[NSUserDefaults standardUserDefaults] synchronize]; [[NSUserDefaults standardUserDefaults] setFloat:_currentTimeSlider.value forKey:@"time 0"]; [[NSUserDefaults standardUserDefaults] synchronize]; } } } - (IBAction)setCurrentTime:(id)scrubber { [NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(updateTime:) userInfo:nil repeats:YES]; [self.audioPlayer setCurrentAudioTime:self.currentTimeSlider.value]; self.scrubbing = FALSE; } - (IBAction)userIsScrubbing:(id)sender { self.scrubbing = TRUE; } 

    1 answer 1

    Not. There is no better solution for your task.