From 24ac77c2909f379e371f328381cee314c48777e1 Mon Sep 17 00:00:00 2001 From: Jacob Trueb Date: Thu, 9 Dec 2021 13:14:47 -0600 Subject: [PATCH 1/2] Remove unused and perpetually growing and recursive UploadResultDatabase for iOS --- ios/Classes/SwiftFlutterUploaderPlugin.swift | 9 -- ios/Classes/URLSessionUploader.swift | 2 - ios/Classes/UploadResultDatabase.swift | 112 ------------------- 3 files changed, 123 deletions(-) delete mode 100644 ios/Classes/UploadResultDatabase.swift diff --git a/ios/Classes/SwiftFlutterUploaderPlugin.swift b/ios/Classes/SwiftFlutterUploaderPlugin.swift index f7e855a..13cc2c1 100644 --- a/ios/Classes/SwiftFlutterUploaderPlugin.swift +++ b/ios/Classes/SwiftFlutterUploaderPlugin.swift @@ -47,14 +47,6 @@ public class SwiftFlutterUploaderPlugin: NSObject, FlutterPlugin { self.resultHandler = CachingStreamHandler() resultEventChannel.setStreamHandler(resultHandler) - // load entries from database into StreamHandlers, which cache the values. - let resultDatabase = UploadResultDatabase.shared - for map in resultDatabase.results { - if let taskId = map[Key.taskId] as? String { - resultHandler.add(taskId, map) - } - } - self.taskQueue = DispatchQueue(label: "chillisource.flutter_uploader.dispatch.queue") super.init() @@ -66,7 +58,6 @@ public class SwiftFlutterUploaderPlugin: NSObject, FlutterPlugin { case "setBackgroundHandler": setBackgroundHandler(call, result) case "clearUploads": - UploadResultDatabase.shared.clear() resultHandler.clear() progressHandler.clear() diff --git a/ios/Classes/URLSessionUploader.swift b/ios/Classes/URLSessionUploader.swift index 3a51fac..9e8a2c9 100644 --- a/ios/Classes/URLSessionUploader.swift +++ b/ios/Classes/URLSessionUploader.swift @@ -120,8 +120,6 @@ class URLSessionUploader: NSObject { delegates.append(EngineManager()) - delegates.append(UploadResultDatabase.shared) - self.queue.name = "chillisource.flutter_uploader.queue" let mainBundle = Bundle.main diff --git a/ios/Classes/UploadResultDatabase.swift b/ios/Classes/UploadResultDatabase.swift deleted file mode 100644 index 77659e5..0000000 --- a/ios/Classes/UploadResultDatabase.swift +++ /dev/null @@ -1,112 +0,0 @@ -// -// UploadResultDatabase.swift -// flutter_uploader -// -// Created by Sebastian Roth on 21/07/2020. -// - -import Foundation - -/// A helper class which stores the upload results for later retrieval by the plugin. -/// This mimics the behavior of the workmanager LiveData on Android, which allows a limited retrieval of completed work. -class UploadResultDatabase: UploaderDelegate { - static let shared = UploadResultDatabase() - - private init() { - if let url = resultsPListURL, let plist = try? loadPropertyList(url) { - for result in plist { - if let map = result as? [String: Any] { - self.results.append(map) - } - } - } - } - - public func clear() { - results.removeAll() - - guard let url = resultsPListURL else { return } - - do { - try savePropertyList(url, []) - } catch { - print("error write \(error)") - } - } - - var results: [[String: Any]] = [] - - func uploadEnqueued(taskId: String) { - results.append([ - Key.taskId: taskId, - Key.status: UploadTaskStatus.enqueue.rawValue - ]) - - guard let url = resultsPListURL else { return } - - do { - try savePropertyList(url, results) - } catch { - print("error write \(error)") - } - } - - func uploadProgressed(taskId: String, inStatus: UploadTaskStatus, progress: Int) { - // No need to store in-flight. - } - - func uploadCompleted(taskId: String, message: String?, statusCode: Int, headers: [String: Any]) { - results.append([ - Key.taskId: taskId, - Key.status: UploadTaskStatus.completed.rawValue, - Key.message: message ?? "", - Key.statusCode: statusCode, - Key.headers: headers - ]) - - guard let url = resultsPListURL else { return } - - do { - try savePropertyList(url, results) - } catch { - print("error write \(error)") - } - } - - func uploadFailed(taskId: String, inStatus: UploadTaskStatus, statusCode: Int, errorCode: String, errorMessage: String?, errorStackTrace: [String]) { - results.append([ - Key.taskId: taskId, - Key.status: inStatus.rawValue, - Key.statusCode: statusCode, - Key.code: errorCode, - Key.message: errorMessage ?? NSNull(), - Key.details: errorStackTrace - ]) - - guard let url = resultsPListURL else { return } - - do { - try savePropertyList(url, results) - } catch { - print("error write \(error)") - } - } - - private func savePropertyList(_ plistURL: URL, _ plist: Any) throws { - let plistData = try PropertyListSerialization.data(fromPropertyList: plist, format: .xml, options: 0) - try plistData.write(to: plistURL) - } - - private func loadPropertyList(_ plistURL: URL) throws -> [Any] { - let data = try Data(contentsOf: plistURL) - guard let plist = try PropertyListSerialization.propertyList(from: data, format: nil) as? [Any] else { - return [] - } - return plist - } - - private var resultsPListURL: URL? { - let documentDirectoryURL = try? FileManager.default.url(for: .applicationSupportDirectory, in: .userDomainMask, appropriateFor: nil, create: true) - return documentDirectoryURL?.appendingPathComponent("flutter_uploader-results.plist") - } -} From f3e40c2b3583d3b85ca479f9c03adc1319ce86e8 Mon Sep 17 00:00:00 2001 From: Jacob Trueb Date: Thu, 9 Dec 2021 13:49:53 -0600 Subject: [PATCH 2/2] Clear the cache for the stream handler once a listener sinks it --- ios/Classes/CachingStreamHandler.swift | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/ios/Classes/CachingStreamHandler.swift b/ios/Classes/CachingStreamHandler.swift index ae92183..5672d2e 100644 --- a/ios/Classes/CachingStreamHandler.swift +++ b/ios/Classes/CachingStreamHandler.swift @@ -15,12 +15,12 @@ class CachingStreamHandler: NSObject, FlutterStreamHandler { private let cacheSemaphore = DispatchSemaphore(value: 1) func add(_ taskId: String, _ value: T) { - cacheSemaphore.wait() - cache[taskId] = value - cacheSemaphore.signal() - if let sink = eventSink { sink(value) + } else { + cacheSemaphore.wait() + cache[taskId] = value + cacheSemaphore.signal() } } @@ -35,6 +35,7 @@ class CachingStreamHandler: NSObject, FlutterStreamHandler { for cacheEntry in cache { events(cacheEntry.value) } + cache = [:] cacheSemaphore.signal() self.eventSink = events