Skip to content

Commit bbb647b

Browse files
authored
Merge pull request #23 from sukov/version-2.0.1
Hotfix Version 2.0.1
2 parents 59011e4 + 45a54f8 commit bbb647b

File tree

6 files changed

+38
-26
lines changed

6 files changed

+38
-26
lines changed

CachingPlayerItem.podspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
Pod::Spec.new do |s|
22
s.name = 'CachingPlayerItem'
3-
s.version = '2.0.0'
3+
s.version = '2.0.1'
44
s.summary = 'Cache & Play audio and video files'
55

66
s.homepage = 'https://github.com/sukov/CachingPlayerItem'

Example/Podfile.lock

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
PODS:
2-
- CachingPlayerItem (2.0.0)
2+
- CachingPlayerItem (2.0.1)
33
- Nimble (9.2.1)
44
- Quick (4.0.0)
55

@@ -18,7 +18,7 @@ EXTERNAL SOURCES:
1818
:path: "../"
1919

2020
SPEC CHECKSUMS:
21-
CachingPlayerItem: 61dfcd2931cf590d8f461d4cbee65cd2e643f69b
21+
CachingPlayerItem: 7a369d20ddc09f5ac79322fd8ecd5f8369523216
2222
Nimble: e7e615c0335ee4bf5b0d786685451e62746117d5
2323
Quick: 6473349e43b9271a8d43839d9ba1c442ed1b7ac4
2424

Example/Pods/Local Podspecs/CachingPlayerItem.podspec.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Example/Pods/Manifest.lock

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Example/Pods/Target Support Files/CachingPlayerItem/CachingPlayerItem-Info.plist

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Source/ResourceLoaderDelegate.swift

Lines changed: 30 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,12 @@ final class ResourceLoaderDelegate: NSObject, AVAssetResourceLoaderDelegate, URL
2222
private lazy var fileHandle = MediaFileHandle(filePath: saveFilePath)
2323

2424
private var session: URLSession?
25-
private let queue = DispatchQueue(label: "com.gcd.CachingPlayerItemQueue", qos: .userInitiated)
25+
private let operationQueue = {
26+
let queue = OperationQueue()
27+
queue.name = "CachingPlayerItemOperationQueue"
28+
queue.maxConcurrentOperationCount = 1
29+
return queue
30+
}()
2631
private var pendingContentInfoRequest: PendingContentInfoRequest? {
2732
didSet { oldValue?.cancelTask() }
2833
}
@@ -42,14 +47,9 @@ final class ResourceLoaderDelegate: NSObject, AVAssetResourceLoaderDelegate, URL
4247
self.saveFilePath = saveFilePath
4348
self.owner = owner
4449
super.init()
45-
4650
NotificationCenter.default.addObserver(self, selector: #selector(handleAppWillTerminate), name: UIApplication.willTerminateNotification, object: nil)
4751
}
4852

49-
deinit {
50-
invalidateAndCancelSession(shouldResetData: false)
51-
}
52-
5353
// MARK: AVAssetResourceLoaderDelegate
5454

5555
func resourceLoader(_ resourceLoader: AVAssetResourceLoader, shouldWaitForLoadingOfRequestedResource loadingRequest: AVAssetResourceLoadingRequest) -> Bool {
@@ -68,15 +68,15 @@ final class ResourceLoaderDelegate: NSObject, AVAssetResourceLoaderDelegate, URL
6868
let request = PendingDataRequest(url: url, session: session, loadingRequest: loadingRequest, customHeaders: owner?.urlRequestHeaders)
6969
request.delegate = self
7070
request.startTask()
71-
pendingDataRequests[request.id] = request
71+
addOperationOnQueue { [weak self] in self?.pendingDataRequests[request.id] = request }
7272
return true
7373
} else {
7474
return false
7575
}
7676
}
7777

7878
func resourceLoader(_ resourceLoader: AVAssetResourceLoader, didCancel loadingRequest: AVAssetResourceLoadingRequest) {
79-
queue.async { [weak self] in
79+
addOperationOnQueue { [weak self] in
8080
guard let self else { return }
8181
guard let key = pendingDataRequests.first(where: { $1.loadingRequest.request.url == loadingRequest.request.url })?.key else { return }
8282

@@ -88,7 +88,7 @@ final class ResourceLoaderDelegate: NSObject, AVAssetResourceLoaderDelegate, URL
8888
// MARK: URLSessionDelegate
8989

9090
func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data) {
91-
queue.async { [weak self] in
91+
addOperationOnQueue { [weak self] in
9292
guard let self else { return }
9393

9494
pendingDataRequests[dataTask.taskIdentifier]?.respond(withRemoteData: data)
@@ -98,7 +98,7 @@ final class ResourceLoaderDelegate: NSObject, AVAssetResourceLoaderDelegate, URL
9898
bufferData.append(data)
9999
writeBufferDataToFileIfNeeded()
100100

101-
guard let response = contentInfoResponse else { return }
101+
guard let response = contentInfoResponse ?? dataTask.response else { return }
102102

103103
DispatchQueue.main.async {
104104
self.owner?.delegate?.playerItem?(self.owner!,
@@ -109,12 +109,13 @@ final class ResourceLoaderDelegate: NSObject, AVAssetResourceLoaderDelegate, URL
109109
}
110110

111111
func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) {
112-
queue.async { [weak self] in
112+
addOperationOnQueue { [weak self] in
113113
guard let self else { return }
114114

115115
let taskId = task.taskIdentifier
116+
if let error {
117+
guard (error as? URLError)?.code != .cancelled else { return }
116118

117-
if let error = error {
118119
if pendingContentInfoRequest?.id == taskId {
119120
finishLoadingPendingRequest(withId: taskId, error: error)
120121
downloadFailed(with: error)
@@ -141,7 +142,7 @@ final class ResourceLoaderDelegate: NSObject, AVAssetResourceLoaderDelegate, URL
141142
writeBufferDataToFileIfNeeded(forced: true)
142143
}
143144

144-
let error = verifyResponse()
145+
let error = verify(response: contentInfoResponse ?? task.response)
145146

146147
guard error == nil else {
147148
downloadFailed(with: error!)
@@ -169,10 +170,11 @@ final class ResourceLoaderDelegate: NSObject, AVAssetResourceLoaderDelegate, URL
169170
func invalidateAndCancelSession(shouldResetData: Bool = true) {
170171
session?.invalidateAndCancel()
171172
session = nil
173+
operationQueue.cancelAllOperations()
172174

173175
if shouldResetData {
174176
bufferData = Data()
175-
queue.async { [weak self] in
177+
addOperationOnQueue { [weak self] in
176178
guard let self else { return }
177179

178180
pendingContentInfoRequest = nil
@@ -228,8 +230,8 @@ final class ResourceLoaderDelegate: NSObject, AVAssetResourceLoaderDelegate, URL
228230
}
229231
}
230232

231-
private func verifyResponse() -> NSError? {
232-
guard let response = contentInfoResponse as? HTTPURLResponse else { return nil }
233+
private func verify(response: URLResponse?) -> NSError? {
234+
guard let response = response as? HTTPURLResponse else { return nil }
233235

234236
let shouldVerifyDownloadedFileSize = CachingPlayerItemConfiguration.shouldVerifyDownloadedFileSize
235237
let minimumExpectedFileSize = CachingPlayerItemConfiguration.minimumExpectedFileSize
@@ -254,6 +256,16 @@ final class ResourceLoaderDelegate: NSObject, AVAssetResourceLoaderDelegate, URL
254256
}
255257
}
256258

259+
private func addOperationOnQueue(_ block: @escaping () -> Void) {
260+
let blockOperation = BlockOperation()
261+
blockOperation.addExecutionBlock({ [unowned blockOperation] in
262+
guard blockOperation.isCancelled == false else { return }
263+
264+
block()
265+
})
266+
operationQueue.addOperation(blockOperation)
267+
}
268+
257269
@objc private func handleAppWillTerminate() {
258270
invalidateAndCancelSession(shouldResetData: false)
259271
}
@@ -265,12 +277,12 @@ extension ResourceLoaderDelegate: PendingDataRequestDelegate {
265277
func pendingDataRequest(_ request: PendingDataRequest, hasSufficientCachedDataFor offset: Int, with length: Int) -> Bool {
266278
fileHandle.fileSize >= length + offset
267279
}
268-
280+
269281
func pendingDataRequest(_ request: PendingDataRequest,
270282
requestCachedDataFor offset: Int,
271283
with length: Int,
272284
completion: @escaping ((_ continueRequesting: Bool) -> Void)) {
273-
queue.async { [weak self] in
285+
addOperationOnQueue { [weak self] in
274286
guard let self else { return }
275287

276288
let bytesCached = fileHandle.fileSize

0 commit comments

Comments
 (0)