From: Claudio Cambra Date: Mon, 20 Mar 2023 14:02:29 +0000 (+0100) Subject: Parallelise conversion of NKFiles to NextcloudItemMetadataTables X-Git-Tag: archive/raspbian/3.16.7-1_deb13u1+rpi1~1^2~12^2~10^2~55^2~21 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=766ecf410f940cf6d702971edd302370963de9d3;p=nextcloud-desktop.git Parallelise conversion of NKFiles to NextcloudItemMetadataTables Signed-off-by: Claudio Cambra --- diff --git a/shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/Database/NextcloudItemMetadataTable+NKFile.swift b/shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/Database/NextcloudItemMetadataTable+NKFile.swift index 305d9cb0b..29683e722 100644 --- a/shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/Database/NextcloudItemMetadataTable+NKFile.swift +++ b/shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/Database/NextcloudItemMetadataTable+NKFile.swift @@ -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) + } } }