Parallelise conversion of NKFiles to NextcloudItemMetadataTables
authorClaudio Cambra <claudio.cambra@nextcloud.com>
Mon, 20 Mar 2023 14:02:29 +0000 (15:02 +0100)
committerClaudio Cambra <claudio.cambra@nextcloud.com>
Fri, 12 May 2023 08:02:37 +0000 (16:02 +0800)
Signed-off-by: Claudio Cambra <claudio.cambra@nextcloud.com>
shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/Database/NextcloudItemMetadataTable+NKFile.swift

index 305d9cb0b6004a149c9dc64a062db5119e172038..29683e7220c68c618a42abfa58b81b51230e8aa1 100644 (file)
@@ -98,21 +98,31 @@ extension NextcloudItemMetadataTable {
         var childDirectoriesMetadatas: [NextcloudItemMetadataTable] = []
         var metadatas: [NextcloudItemMetadataTable] = []
 
-        for file in files {
-            let metadata = NextcloudItemMetadataTable.fromNKFile(file, account: account)
+        let conversionQueue = DispatchQueue(label: "nkFileToMetadataConversionQueue", qos: .userInitiated, attributes: .concurrent)
+        let appendQueue = DispatchQueue(label: "metadataAppendQueue", qos: .userInitiated) // Serial queue
+        let dispatchGroup = DispatchGroup()
 
+        for file in files {
             if metadatas.isEmpty && !directoryMetadataSet {
-                assert(metadata.directory) // In directory read first metadata will always be a dir
+                let metadata = NextcloudItemMetadataTable.fromNKFile(file, account: account)
                 directoryMetadata = metadata;
                 directoryMetadataSet = true;
             } else {
-                metadatas.append(metadata)
-                if metadata.directory {
-                    childDirectoriesMetadatas.append(metadata)
+                conversionQueue.async(group: dispatchGroup) {
+                    let metadata = NextcloudItemMetadataTable.fromNKFile(file, account: account)
+
+                    appendQueue.async(group: dispatchGroup) {
+                        metadatas.append(metadata)
+                        if metadata.directory {
+                            childDirectoriesMetadatas.append(metadata)
+                        }
+                    }
                 }
             }
         }
 
-        completionHandler(directoryMetadata, childDirectoriesMetadatas, metadatas)
+        dispatchGroup.notify(queue: DispatchQueue.main) {
+            completionHandler(directoryMetadata, childDirectoriesMetadatas, metadatas)
+        }
     }
 }