测试已测试 | ✗ |
语言语言 | Obj-CObjective C |
许可证 | MIT |
发布最新发布 | 2015年4月 |
由 Andrew Crookston 维护。
我在KVO仍然激活的时候收到了很多关于AVPlayerItem已释放但仍存在的崩溃报告。当AVPlayerItem在UITableViewCell内部随机释放时手动删除KVO很困难。
ACRObservingPlayerItem是一个用于AVPlayerItem的简单包装类,它处理了一些常见的播放事件,并在释放时安全地释放KVO。
使用Cocoapods安装
pod "ACRObservingPlayerItem"
或将.m和.h文件复制到您的项目中
在您的视图文件中导入头文件
#import "ACRObservingPlayerItem.h"
将代理添加到您的类/控制器中
@interface YourViewController () <ACRObservingPlayerItemDelegate>
@end
然后实现所需的代理方法(全部可选)
- (void)playerItemReachedEnd;
- (void)playerItemStalled;
- (void)playerItemReadyToPlay;
- (void)playerItemPlayFailed;
- (void)playerItemRemovedObservation;
创建播放项并分配代理
ACRObservingPlayerItem *playerItem = [[ACRObservingPlayerItem alloc] initWithAsset:self.videoAsset];
playerItem.delegate = self;
如果对象已释放/deinit,将尝试在代理上调用 playerItemRemovedObservation
。
这一对象的整个目的是在释放时自动释放KVO,但为了安全起见,您应该在视图或代理被移除时将其置为nil
- (void)dealloc {
playerItem.delegate = nil;
// or
playerItem = nil;
}
1.1版本已改为通过Obj-C桥接头文件支持Swift。阅读这篇优秀的教程,开始使用Swift和Cocoapods:[Cocoapods with Swift](https://medium.com/@jigarm/cocoapods-with-swift-93bd373a7111)
在您的桥接头文件中放入
#import "ACRObservingPlayerItem.h"
完整的Swift示例
import UIKit
import AVFoundation
class VideoPlayerController: UIViewController, ACRObservingPlayerItemDelegate {
var playerItem : ACRObservingPlayerItem?
init {
self.playerItem = ACRObservingPlayerItem(asset: self.video)
self.playerItem!.delegate = self
}
deinit {
playerItem?.delegate = nil
// or
playerItem = nil
}
// MARK: ACRObservingPlayerItemDelegate
func playerItemReachedEnd() {
// rewind and play?
}
func playerItemReadyToPlay() {
// play!
}
func playerItemPlayFailed() { }
func playerItemStalled() { }
func playerItemRemovedObservation() { }
}
MIT
可能会有一些。我是在深夜里写的,但似乎对我有所帮助。
请提交一个问题或pull-request。谢谢。我不喜欢通过电子邮件或GitHub消息修复错误。
如果这个库对您有帮助,请告诉我。我在Twitter上是@acr,或在GitHub上联系我。