ACRObservingPlayerItem 1.1.0

ACRObservingPlayerItem 1.1.0

测试已测试
语言语言 Obj-CObjective C
许可证 MIT
发布最新发布2015年4月

Andrew Crookston 维护。



  • 作者
  • Andrew Crookston

为什么?

我在KVO仍然激活的时候收到了很多关于AVPlayerItem已释放但仍存在的崩溃报告。当AVPlayerItem在UITableViewCell内部随机释放时手动删除KVO很困难。

什么是?

ACRObservingPlayerItem是一个用于AVPlayerItem的简单包装类,它处理了一些常见的播放事件,并在释放时安全地释放KVO。

如何?

使用Cocoapods安装

pod "ACRObservingPlayerItem"

或将.m和.h文件复制到您的项目中

Objective-C

在您的视图文件中导入头文件

#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;
}
Swift

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上联系我。