Skip to content

Commit 6c3fb5b

Browse files
committed
refactoring
1 parent b68d121 commit 6c3fb5b

File tree

4 files changed

+36
-16
lines changed

4 files changed

+36
-16
lines changed

Sources/swiftui-loop-videoplayer/protocol/player/AbstractPlayer.swift

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,9 @@ public protocol AbstractPlayer: AnyObject {
3838
/// The queue player that plays the video items.
3939
var player: AVQueuePlayer? { get set }
4040

41+
/// Observes the status property of the new player item.
42+
var statusObserver: NSKeyValueObservation? { get set }
43+
4144
// Playback control methods
4245

4346
/// Initiates or resumes playback of the video.
@@ -178,14 +181,17 @@ extension AbstractPlayer{
178181
self.loop()
179182
}
180183

184+
if let statusObserver{
185+
statusObserver.invalidate()
186+
}
187+
181188
if let callback{
182-
var token: NSKeyValueObservation?
183-
token = newItem.observe(\.status, options: [.new, .old]) { item, change in
184-
if item.status == .readyToPlay {
185-
callback()
186-
token?.invalidate() // Invalidate token to stop observing
187-
token = nil
188-
}
189+
statusObserver = newItem.observe(\.status, options: [.new, .old]) { [weak self] item, change in
190+
guard item.status == .readyToPlay else { return }
191+
callback()
192+
self?.statusObserver?.invalidate()
193+
self?.statusObserver = nil
194+
print("statusObserver")
189195
}
190196
}
191197

@@ -200,6 +206,7 @@ extension AbstractPlayer{
200206
/// - Parameter time: The target time to seek to in the video timeline.
201207
func seek(to time: Double) {
202208
guard let player = player, let duration = player.currentItem?.duration else {
209+
print(player?.currentItem, "player.currentItem")
203210
delegate?.didSeek(value: false, currentTime: time)
204211
return
205212
}
@@ -459,7 +466,14 @@ extension AbstractPlayer{
459466
/// - player: A reference to the AVQueuePlayer to be cleaned up. Modified directly to deallocate resources.
460467
/// - playerLooper: A reference to the AVPlayerLooper associated with the player. It's disabled and set to nil.
461468
/// - errorObserver: A reference to an NSKeyValueObservation monitoring the player, which is invalidated and set to nil.
462-
internal func cleanUp(player: inout AVQueuePlayer?, playerLooper: inout AVPlayerLooper?, errorObserver: inout NSKeyValueObservation?, timeObserverToken: inout Any?) {
469+
internal func cleanUp(
470+
player: inout AVQueuePlayer?,
471+
playerLooper: inout AVPlayerLooper?,
472+
errorObserver: inout NSKeyValueObservation?,
473+
statusObserver: inout NSKeyValueObservation?,
474+
timeObserver: inout Any?
475+
) {
476+
463477
errorObserver?.invalidate()
464478
errorObserver = nil
465479

@@ -473,9 +487,9 @@ internal func cleanUp(player: inout AVQueuePlayer?, playerLooper: inout AVPlayer
473487
player?.remove(item)
474488
}
475489

476-
if let observerToken = timeObserverToken {
490+
if let observerToken = timeObserver {
477491
player?.removeTimeObserver(observerToken)
478-
timeObserverToken = nil
492+
timeObserver = nil
479493
}
480494

481495
player = nil

Sources/swiftui-loop-videoplayer/protocol/player/LoopingPlayerProtocol.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public protocol LoopingPlayerProtocol: AbstractPlayer, LayerMakerProtocol{
3535
var errorObserver: NSKeyValueObservation? { get set }
3636

3737
/// Declare a variable to hold the time observer token outside the if statement
38-
var timeObserverToken: Any? { get set }
38+
var timeObserver: Any? { get set }
3939

4040
/// Initializes a new player view with specified video asset and configurations.
4141
///
@@ -114,7 +114,7 @@ internal extension LoopingPlayerProtocol {
114114
compositeLayer.frame = CGRect(x: 0, y: 0, width: bounds.width, height: bounds.height)
115115

116116
if let timePublishing{
117-
timeObserverToken = player.addPeriodicTimeObserver(forInterval: timePublishing, queue: .main) { [weak self] time in
117+
timeObserver = player.addPeriodicTimeObserver(forInterval: timePublishing, queue: .main) { [weak self] time in
118118
guard let self = self else{ return }
119119

120120
self.delegate?.didPassedTime(seconds: time.seconds)

Sources/swiftui-loop-videoplayer/view/player/ios/LoopingPlayerUIView.swift

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,11 +40,14 @@ class LoopingPlayerUIView: UIView, LoopingPlayerProtocol {
4040
internal var player: AVQueuePlayer?
4141

4242
/// Declare a variable to hold the time observer token outside the if statement
43-
internal var timeObserverToken: Any?
43+
internal var timeObserver: Any?
4444

4545
/// Observer for errors from the AVQueuePlayer.
4646
internal var errorObserver: NSKeyValueObservation?
4747

48+
/// Observes the status property of the new player item.
49+
internal var statusObserver: NSKeyValueObservation?
50+
4851
/// The delegate to be notified about errors encountered by the player.
4952
weak var delegate: PlayerDelegateProtocol?
5053

@@ -77,7 +80,7 @@ class LoopingPlayerUIView: UIView, LoopingPlayerProtocol {
7780
/// This method invalidates the status and error observers to prevent memory leaks,
7881
/// pauses the player, and clears out player-related references to assist in clean deinitialization.
7982
deinit {
80-
cleanUp(player: &player, playerLooper: &playerLooper, errorObserver: &errorObserver, timeObserverToken: &timeObserverToken)
83+
cleanUp(player: &player, playerLooper: &playerLooper, errorObserver: &errorObserver, statusObserver: &statusObserver, timeObserver: &timeObserver)
8184
}
8285
}
8386
#endif

Sources/swiftui-loop-videoplayer/view/player/mac/LoopingPlayerNSView.swift

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,14 @@ class LoopingPlayerNSView: NSView, LoopingPlayerProtocol {
4242
internal var player: AVQueuePlayer?
4343

4444
/// Declare a variable to hold the time observer token outside the if statement
45-
internal var timeObserverToken: Any?
45+
internal var timeObserver: Any?
4646

4747
/// Observer for errors from the AVQueuePlayer.
4848
internal var errorObserver: NSKeyValueObservation?
4949

50+
/// Observes the status property of the new player item.
51+
internal var statusObserver: NSKeyValueObservation?
52+
5053
/// The delegate to be notified about errors encountered by the player.
5154
weak var delegate: PlayerDelegateProtocol?
5255

@@ -79,7 +82,7 @@ class LoopingPlayerNSView: NSView, LoopingPlayerProtocol {
7982
/// This method invalidates the status and error observers to prevent memory leaks,
8083
/// pauses the player, and clears out player-related references to assist in clean deinitialization.
8184
deinit {
82-
cleanUp(player: &player, playerLooper: &playerLooper, errorObserver: &errorObserver, timeObserverToken: &timeObserverToken)
85+
cleanUp(player: &player, playerLooper: &playerLooper, errorObserver: &errorObserver, statusObserver: &statusObserver, timeObserver: &timeObserver)
8386
}
8487
}
8588
#endif

0 commit comments

Comments
 (0)