如何创建AVPlayer单例类

iDi*_*Dia 3 singleton ios avplayer

我正在使用AVPlayer从网址播放歌曲,我初始化并在我的viewcontroller中分配它,现在我有一个问题,当我导航到另一个视图控制器并返回主播放器播放歌曲细节和滑块更新应该保留但问题是什么时候我再次导航到主播放器播放细节和滑块更新未发生但歌曲不断播放.我怎么能避免这种情况,任何人都能告诉我一些例子.我需要创建一个单例类吗?如果是这样,如何创建单例类AVPlayer

Muh*_*ris 7

解决方案1: 您还应该在PlayerViewController的viewWillAppear中更新UI.Song继续播放,因为您不会退出或取消分配您的PlayerViewController.如果弹出或关闭PlayerViewController,则此解决方案将无效.

解决方案2: 创建一个包含AVAudioPlayer实例的Singleton类.例如

MediaManager.h

@interface MediaManager : NSObject{

}

+(MediaManager *)sharedInstance;
-(void)playWithURL:(NSURL *)url;
-(float)currentPlaybackTime; 
@end
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

在其中添加其他必要的方法,如"stopPlayer"等.

样本方法调用

[[MediaManager sharedInstance] playWithURL:url];
float currentTime = [[MediaManager sharedInstance] currentPlaybackTime];
// Update slider
Run Code Online (Sandbox Code Playgroud)