如何创建AVPlayer单例类

3
我正在使用AVPlayer播放来自URL的歌曲,我在我的视图控制器中初始化和分配它,现在我遇到了一个问题:当我导航到另一个视图控制器并返回到主播放器时,播放歌曲的详细信息和滑块更新应该保持不变,但问题是当我再次导航到主播放器时,播放详细信息和滑块更新没有发生,但歌曲仍在不断播放。我如何避免这种情况,有人能给我展示一些例子吗?我需要创建一个单例类吗?如果需要,如何为AVPlayer创建一个单例类?
1个回答

7
解决方案 1:应该在播放器视图控制器的 viewWillAppear 中更新用户界面。歌曲继续播放是因为您没有从 PlayerViewController 返回或将其释放。如果弹出或取消 PlayerViewController,则此解决方案将无效。

解决方案 2: 创建一个单例类,在其中包含 AVAudioPlayer 实例。例如:

MediaManager.h

@interface MediaManager : NSObject{

}

+(MediaManager *)sharedInstance;
-(void)playWithURL:(NSURL *)url;
-(float)currentPlaybackTime; 
@end

MediaManager.m

static MediaManager *sharedInstance = nil;
@interface MediaManager (){
AVAudioPlayer *audioPlayer;
}

@end
@implementation MediaManager

-(id)init{
if(self = [super init]){

}
return self;
}

+(MediaManager *)sharedInstance{ 
 //create an instance if not already else return
    if(!sharedInstance){   
      sharedInstance = [[[self class] alloc] init];
    }
  return sharedInstance;
}

-(void)playWithURL:(NSURL *)url{
NSError *error = nil;
audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error];
if(error == nil){
    [audioPlayer play];
}
}

-(float)currentPlaybackTime{

   return audioPlayer.currentTime;
}

@end

在其中添加其他必要的方法,例如“stopPlayer”等。
示例方法调用。
[[MediaManager sharedInstance] playWithURL:url];
float currentTime = [[MediaManager sharedInstance] currentPlaybackTime];
// Update slider

很好的解释,对我帮助很大。 - Asmita

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接