这里是一个使用@unowned
和逃逸闭包的CMTime
封装函数的示例解决方法:
class Player {
var playerItem: AVPlayerItem?
var timeObserver: Any?
func addTimeObserver(completion: @escaping (CMTime) -> Void) {
guard let playerItem = playerItem else {
return
}
let interval = CMTime(seconds: 1, preferredTimescale: CMTimeScale(NSEC_PER_SEC))
let mainQueue = DispatchQueue.main
// 使用unowned self确保不会引起循环引用
timeObserver = playerItem.addPeriodicTimeObserver(forInterval: interval, queue: mainQueue) { [unowned self] time in
completion(time)
}
}
func removeTimeObserver() {
if let timeObserver = self.timeObserver {
playerItem?.removeTimeObserver(timeObserver)
self.timeObserver = nil
}
}
}
在这个示例中,我们创建了一个Player
类,其中包含一个addTimeObserver
方法和一个removeTimeObserver
方法。addTimeObserver
方法使用CMTime
来添加一个周期性的时间观察器,并在每个时间间隔调用提供的闭包。为了避免循环引用,我们使用[unowned self]
来捕获self
,以确保在闭包内部不会持有对Player
实例的强引用。
使用示例:
let player = Player()
player.playerItem = AVPlayerItem(url: URL(string: "your_video_url")!)
player.addTimeObserver { time in
print("Current time: \(time.seconds)")
}
// 在适当的时候调用removeTimeObserver以避免内存泄漏
player.removeTimeObserver()
在使用addTimeObserver
方法时,我们可以通过传递一个闭包来处理每个时间间隔的时间更新。在这个示例中,我们简单地打印出当前时间。在不再需要时间观察器时,我们可以调用removeTimeObserver
方法来移除它,以避免内存泄漏。