Skip to content

Commit 9895e8b

Browse files
committed
initial work
1 parent 5555641 commit 9895e8b

File tree

4 files changed

+54
-8
lines changed

4 files changed

+54
-8
lines changed

Sources/TUSKit/Files.swift

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,37 @@ final class Files {
157157
}
158158
}
159159

160+
@available(iOS 13.4, *)
161+
func streamingData(_ dataGenerator: () -> Data?, id: UUID, preferredFileExtension: String? = nil) throws -> URL {
162+
try queue.sync {
163+
try makeDirectoryIfNeeded()
164+
165+
let fileName: String
166+
if let fileExtension = preferredFileExtension {
167+
fileName = id.uuidString + fileExtension
168+
} else {
169+
fileName = id.uuidString
170+
}
171+
172+
let targetLocation = storageDirectory.appendingPathComponent(fileName)
173+
if !FileManager.default.fileExists(atPath: targetLocation.path) {
174+
FileManager.default.createFile(atPath: targetLocation.path, contents: nil)
175+
}
176+
177+
let destinationHandle = try FileHandle(forWritingTo: targetLocation)
178+
defer {
179+
try? destinationHandle.close()
180+
}
181+
182+
while let data = dataGenerator() {
183+
guard !data.isEmpty else { throw FilesError.dataIsEmpty }
184+
try destinationHandle.write(contentsOf: data)
185+
}
186+
187+
return targetLocation
188+
}
189+
}
190+
160191
/// Removes metadata and its related file from disk
161192
/// - Parameter metaData: The metadata description
162193
/// - Throws: Any error from FileManager when removing a file.

Sources/TUSKit/Tasks/UploadDataTask.swift

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -182,9 +182,25 @@ final class UploadDataTask: NSObject, IdentifiableTask {
182182

183183
// Can't use switch with #available :'(
184184
let data: Data
185-
if let range = self.range, #available(iOS 13.0, macOS 10.15, *) { // Has range, for newer versions
186-
try fileHandle.seek(toOffset: UInt64(range.startIndex))
187-
data = fileHandle.readData(ofLength: range.count)
185+
if let range = self.range, #available(iOS 13.4, macOS 10.15, *) { // Has range, for newer versions
186+
var offset = range.startIndex
187+
188+
return try files.streamingData({
189+
autoreleasepool {
190+
do {
191+
let chunkSize = min(1024 * 1024 * 500, range.endIndex - offset)
192+
try fileHandle.seek(toOffset: UInt64(offset))
193+
guard offset < range.endIndex else { return nil }
194+
195+
let data = fileHandle.readData(ofLength: chunkSize)
196+
print("read data of size \(data.count) at offset \(offset)")
197+
offset += chunkSize
198+
return data
199+
} catch {
200+
return nil
201+
}
202+
}
203+
}, id: metaData.id, preferredFileExtension: "uploadData")
188204
} else if let range = self.range { // Has range, for older versions
189205
fileHandle.seek(toFileOffset: UInt64(range.startIndex))
190206
data = fileHandle.readData(ofLength: range.count)

TUSKitExample/TUSKitExample/Screens/Upload/RowViews/ProgressRowView.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,8 @@ struct ProgressRowView: View {
9696
UploadActionImage(icon: .pause)
9797
}
9898

99-
DestructiveButton(title: showTitle ? "Remove" : nil) {
100-
tusWrapper.clearUpload(id: key)
101-
}
99+
// DestructiveButton(title: showTitle ? "Remove" : nil) {
100+
// tusWrapper.clearUpload(id: key)
101+
// }
102102
}
103103
}

TUSKitExample/TUSKitExample/Screens/Upload/UploadsListView.swift

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -117,8 +117,6 @@ extension UploadsListView {
117117

118118

119119
// MARK: - Records List View
120-
121-
122120
@ViewBuilder
123121
private func uploadRecordsListView(items: [UUID: UploadStatus]) -> some View {
124122
ScrollView {
@@ -134,6 +132,7 @@ extension UploadsListView {
134132
case .uploaded(let url):
135133
UploadedRowView(key: idx.key, url: url)
136134
case .failed(let error):
135+
let _ = print(error)
137136
FailedRowView(key: idx.key, error: error)
138137
}
139138
}

0 commit comments

Comments
 (0)