perf: incremental download queue lookup updates, async cover cleanup, and native JSON decoding on iOS

- Embed DownloadQueueLookup into DownloadQueueState; add updatedForIndices() for O(changed) incremental updates during frequent progress ticks instead of full O(n) rebuild
- downloadQueueLookupProvider now reads pre-computed lookup from state directly
- Replace sync file deletion in DownloadedEmbeddedCoverResolver with unawaited async cleanup to avoid blocking the main thread
- Parse JSON payloads on iOS native side (parseJsonPayload) so event sinks and method channel responses return native objects, avoiding redundant Dart-side JSON decode
- Use .cast<String, dynamic>() instead of Map.from() in _decodeMapResult for zero-copy map handling
This commit is contained in:
zarzet
2026-04-03 23:03:11 +07:00
parent 38a8b715f8
commit b50eec5a47
4 changed files with 105 additions and 25 deletions
+16 -5
View File
@@ -135,7 +135,7 @@ import Gobackend // Import Go framework
}
self.lastDownloadProgressPayload = payload
DispatchQueue.main.async { [weak self] in
self?.downloadProgressEventSink?(payload)
self?.downloadProgressEventSink?(self?.parseJsonPayload(payload))
}
}
downloadProgressTimer = timer
@@ -165,7 +165,7 @@ import Gobackend // Import Go framework
}
self.lastLibraryScanProgressPayload = payload
DispatchQueue.main.async { [weak self] in
self?.libraryScanProgressEventSink?(payload)
self?.libraryScanProgressEventSink?(self?.parseJsonPayload(payload))
}
}
libraryScanProgressTimer = timer
@@ -179,6 +179,17 @@ import Gobackend // Import Go framework
libraryScanProgressEventSink = nil
lastLibraryScanProgressPayload = nil
}
private func parseJsonPayload(_ payload: String) -> Any {
guard let data = payload.data(using: .utf8) else {
return payload
}
do {
return try JSONSerialization.jsonObject(with: data, options: [.fragmentsAllowed])
} catch {
return payload
}
}
private func handleMethodCall(call: FlutterMethodCall, result: @escaping FlutterResult) {
DispatchQueue.global(qos: .userInitiated).async {
@@ -215,11 +226,11 @@ import Gobackend // Import Go framework
case "getDownloadProgress":
let response = GobackendGetDownloadProgress()
return response
return parseJsonPayload(response as String? ?? "{}")
case "getAllDownloadProgress":
let response = GobackendGetAllDownloadProgress()
return response
return parseJsonPayload(response as String? ?? "{}")
case "initItemProgress":
let args = call.arguments as! [String: Any]
@@ -979,7 +990,7 @@ import Gobackend // Import Go framework
case "getLibraryScanProgress":
let response = GobackendGetLibraryScanProgressJSON()
return response
return parseJsonPayload(response as String? ?? "{}")
case "cancelLibraryScan":
GobackendCancelLibraryScanJSON()