Skip to content

Commit abb6fd2

Browse files
author
Ruben Nine
committed
Set progress as cancelled if MultipartUpload is cancelled.
Observe `totalUnitCount` changes on master progress, for faster feedback and default progress.totalUnitCount to 0 (to correctly indicate indeterminate state.) Synchronize access to setting and removing observers to prevent race conditions in `UploadOperation`.
1 parent f77d17f commit abb6fd2

File tree

3 files changed

+27
-12
lines changed

3 files changed

+27
-12
lines changed

FilestackSDK/Internal/Operations/UploadOperation.swift

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ class UploadOperation: BaseOperation<JSONResponse> {
3737

3838
private let masterProgress = Progress()
3939
private var masterProgressObservers: [NSKeyValueObservation] = []
40+
private let lockQueue = DispatchQueue(label: "com.filestack.FilestackSDK.upload-operation-lock-queue")
4041

4142
// MARK: - Lifecycle
4243

@@ -76,17 +77,21 @@ extension UploadOperation {
7677

7778
private extension UploadOperation {
7879
func setupProgressObservers() {
79-
masterProgressObservers.append(masterProgress.observe(\.totalUnitCount, options: [.new]) { progress, _ in
80-
self.progress.totalUnitCount = progress.totalUnitCount
81-
})
80+
lockQueue.sync {
81+
guard !isCancelled else { return }
8282

83-
masterProgressObservers.append(masterProgress.observe(\.fractionCompleted, options: [.new]) { progress, _ in
84-
self.progress.completedUnitCount = Int64(progress.fractionCompleted * Double(progress.totalUnitCount))
85-
})
83+
masterProgressObservers.append(masterProgress.observe(\.totalUnitCount) { progress, _ in
84+
self.progress.totalUnitCount = progress.totalUnitCount
85+
})
86+
87+
masterProgressObservers.append(masterProgress.observe(\.fractionCompleted) { progress, _ in
88+
self.progress.completedUnitCount = Int64(progress.fractionCompleted * Double(progress.totalUnitCount))
89+
})
90+
}
8691
}
8792

8893
func removeProgressObservers() {
89-
masterProgressObservers.removeAll()
94+
lockQueue.sync { masterProgressObservers.removeAll() }
9095
}
9196

9297
func upload() {

FilestackSDK/Internal/Uploaders/MultipartUpload.swift

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ class MultipartUpload: Uploader, DeferredAdd {
2626

2727
progress.kind = .file
2828
progress.fileOperationKind = .copying
29-
progress.totalUnitCount = -1 // indeterminate
29+
progress.totalUnitCount = 0 // indeterminate
3030

3131
return progress
3232
}()
@@ -61,7 +61,13 @@ class MultipartUpload: Uploader, DeferredAdd {
6161

6262
// MARK: - Uploadable Protocol Implementation
6363

64-
private(set) var state: UploadState = .notStarted
64+
private(set) var state: UploadState = .notStarted {
65+
didSet {
66+
if state == .cancelled {
67+
progress.cancel()
68+
}
69+
}
70+
}
6571

6672
@discardableResult func cancel() -> Bool {
6773
guard state != .cancelled else { return false }
@@ -122,10 +128,14 @@ private extension MultipartUpload {
122128

123129
var results: [JSONResponse] = []
124130

131+
// Observe changes in `progress.totalUnitCount`.
132+
progressObservers.append(masterProgress.observe(\.totalUnitCount) { progress, _ in
133+
self.progress.totalUnitCount = progress.totalUnitCount
134+
})
135+
125136
// Observe changes in `progress.fractionCompleted`.
126-
progressObservers.append(masterProgress.observe(\.fractionCompleted, options: [.new]) { progress, _ in
137+
progressObservers.append(masterProgress.observe(\.fractionCompleted) { progress, _ in
127138
self.progress.completedUnitCount = Int64(progress.fractionCompleted * Double(progress.totalUnitCount))
128-
self.progress.totalUnitCount = progress.totalUnitCount
129139

130140
self.queue.async {
131141
self.uploadProgress?(self.progress)

FilestackSDK/Public/Operations/BaseOperation.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ open class BaseOperation<Success>: Operation {
2323

2424
// MARK: - Private Properties
2525

26-
private var lockQueue = DispatchQueue(label: "com.filestack.FilestackSDK.operation-lock-queue")
26+
private let lockQueue = DispatchQueue(label: "com.filestack.FilestackSDK.operation-lock-queue")
2727

2828
private var _result: Result = .failure(.custom("Result not unavailable."))
2929

0 commit comments

Comments
 (0)