diff --git a/Caches/PlayerCache.swift b/Caches/PlayerCache.swift index 02ad50d..7abf3b8 100644 --- a/Caches/PlayerCache.swift +++ b/Caches/PlayerCache.swift @@ -3,21 +3,23 @@ import AVKit final class PlayerCache { - private let cache = NSCache() + private let cache = NSCache() private var allURLsCached = Set() - private init() {} + private init() { + cache.countLimit = 4 + } } extension PlayerCache { static let shared = PlayerCache() - func player(url: URL) -> AVQueuePlayer { + func player(url: URL) -> AVPlayer { if let player = cache.object(forKey: url as NSURL) { return player } - let player = AVQueuePlayer(url: url) + let player = AVPlayer(url: url) cache.setObject(player, forKey: url as NSURL) allURLsCached.insert(url) diff --git a/Views/UIKit/AttachmentView.swift b/Views/UIKit/AttachmentView.swift index 7d54087..67e5e50 100644 --- a/Views/UIKit/AttachmentView.swift +++ b/Views/UIKit/AttachmentView.swift @@ -1,6 +1,7 @@ // Copyright © 2020 Metabolist. All rights reserved. import AVKit +import Combine import Kingfisher import UIKit import ViewModels @@ -28,7 +29,7 @@ final class AttachmentView: UIView { private let viewModel: AttachmentViewModel private let parentViewModel: AttachmentsRenderingViewModel - private var playerLooper: AVPlayerLooper? + private var playerCancellable: AnyCancellable? init(viewModel: AttachmentViewModel, parentViewModel: AttachmentsRenderingViewModel) { self.viewModel = viewModel @@ -64,11 +65,15 @@ extension AttachmentView { func play() { let player = PlayerCache.shared.player(url: viewModel.attachment.url) - if let cachedPlayerLooper = Self.playerLooperCache[player] { - playerLooper = cachedPlayerLooper - } else if let item = player.currentItem { - playerLooper = AVPlayerLooper(player: player, templateItem: item) - Self.playerLooperCache[player] = playerLooper + playerCancellable = NotificationCenter.default.publisher( + for: .AVPlayerItemDidPlayToEndTime, + object: player.currentItem) + .sink { _ in + player.currentItem?.seek(to: .zero) { success in + guard success else { return } + + player.play() + } } player.isMuted = true @@ -94,8 +99,6 @@ extension AttachmentView { } private extension AttachmentView { - static var playerLooperCache = [AVQueuePlayer: AVPlayerLooper]() - // swiftlint:disable:next function_body_length func initialSetup() { addSubview(imageView)