ios - 如何创建 AVPlayer 单例类

标签 ios singleton avplayer

我正在使用 AVPlayer 从 url 播放歌曲,我在我的 viewcontroller 中初始化并分配了它,现在我遇到了一个问题,当我导航到另一个 view controller 并返回主播放器播放歌曲细节时 slider 更新应该保留,但问题是当我再次导航到主播放器时播放细节和 slider 更新没有发生但歌曲正在连续播放。我怎样才能避免这种情况,谁能给我举个例子。我需要创建一个单例类吗?如果是这样,如何为 AVPlayer 创建单例类?

最佳答案

解决方案 1:您还应该在 PlayerViewController 的 viewWillAppear 中更新 UI。歌曲继续播放,因为您不会返回或取消分配您的 PlayerViewController。如果弹出或关闭 PlayerViewController ,则此解决方案将不起作用。

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

媒体管理器.h

@interface MediaManager : NSObject{

}

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

媒体管理器.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

关于ios - 如何创建 AVPlayer 单例类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19086419/

相关文章:

IOS:获取玩应用程序的 Facebook 好友

iphone - 从 iOS 的 Resources 文件夹中随机选择一个文件

ios - Objective C - 使用 Singleton 的不间断计时器

iphone - 将 AVPlayer 快退 5 秒

ios - 如何显示AVPictureInPictureController?

ios - Firebase queryOrderedByKey 不按时间顺序对帖子进行排序

ios - 在 SWIFT 4 中连接成功后找不到 JSON 解析数据

java - 使用依赖注入(inject)作为单例的替代方案

c# - 使用 Try-Catch block 包装复杂的 linq 查询并捕获正确的异常

iphone - 在后台媒体播放期间响应 MPMoviePlayerController 通知