我正在构建一个应用程序,场景是这样的:
我有3个视图控制器VC1,VC2,VC3 .
scenario1我在VC2上有一个AVPlayer,它使用保存在userDefaults中的“NSURL”来播放视频 . 让我们说这个url的关键是“videoURL” . 现在如果我弹出VC2并返回VC1,dealloc()获取调用,一切都被取消分配,视频停止播放 . 所以,如果我在VC1上更改“videoURL”,然后将VC2推到导航堆栈上,我会得到一个新的AVPlayer,前一个被释放 . 到现在为止没有问题 .
scenario2如果我在VC2上更改“videoURL”,我会使用“replaceCurrentItemWithPlayerItem”来播放一个新的playerItem来播放一个新的视频 . 这里也没有问题 .
scenario3现在,如果我将VC3推入堆栈,如果我回到VC3,我不知道如何播放新的URL . 当我按下VC3时,即使我在推送VC3之前将AVPlayer设置为nil,视频也不会停止播放 . 当我停止视频并推送VC3时,我面临着内存问题 .
实现scenario3的正确方法是什么?
2 回答
您将不得不添加逻辑来查看控制器2的viewWillDisappear方法以停止和释放AVPlayer,并移动创建AVPlayer的逻辑并启动它来播放viewWillAppear(这样当您弹出视图控制器3并返回查看时控制器2你可以再次播放视图控制器2的视频 . )
你如何做到这一点取决于你如何管理AVPlayer . 发布设置AVPlayer的VC2代码,并在VC2的层次结构中安装其回放层 . (编辑原始问题以包含该信息 . 不要在评论中发布代码 . 这几乎是不可读的 . )
这是我为scenario3做的事情:
现在我正在创建一个委托 . 所以现在VC2充当VC3的委托 . 所以当我在VC3上时,我编写了一个代码来生成一个新的Url,并将其传递给VC2中的一个属性 .
所以我得出结论,只要VC2加载到内存中,我就不需要在VC2中解除分配AVPlayer . 同时,也不需要删除与之关联的观察者 .
这是AVPlayer及其观察者的完整演示 . 我相信它将帮助每个开始使用AVFoundation和观察者的人 .
// VC1
//VC2.h
//VC2.m
//VC3.h
//VC3.m
注意:请注意,您应该在每个视图控制器中使用dealloc(),并且应该超时调用视图控制器从内存中删除(弹出导航堆栈) .