From ccad81949aacd5048b01db3dbcecba4b89f2b86c Mon Sep 17 00:00:00 2001 From: Claudio Cambra Date: Wed, 15 Mar 2023 14:37:53 +0100 Subject: [PATCH] Make enumeration of working set changes non-blocking in FileProviderEnumerator Signed-off-by: Claudio Cambra --- .../FileProviderEnumerator.swift | 31 +++++++++++++------ 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/FileProviderEnumerator.swift b/shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/FileProviderEnumerator.swift index 3d9d9d95a..6663ea766 100644 --- a/shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/FileProviderEnumerator.swift +++ b/shell_integration/MacOSX/NextcloudIntegration/FileProviderExt/FileProviderEnumerator.swift @@ -246,14 +246,16 @@ class FileProviderEnumerator: NSObject, NSFileProviderEnumerator { if enumeratedItemIdentifier == .workingSet { Logger.enumeration.debug("Enumerating changes in working set for user: \(self.ncAccount.ncKitAccount, privacy: OSLogPrivacy.auto(mask: .hash))") - let scanResults = FileProviderEnumerator.fullRecursiveScanForChanges(ncAccount: self.ncAccount, ncKit: self.ncKit) - - FileProviderEnumerator.completeChangesObserver(observer, - anchor: anchor, - ncKit: self.ncKit, - newMetadatas: scanResults.newMetadatas, - updatedMetadatas: scanResults.updatedMetadatas, - deletedMetadatas: scanResults.deletedMetadatas) + FileProviderEnumerator.fullRecursiveScanForChanges(ncAccount: self.ncAccount, ncKit: self.ncKit) { newMetadatas, updatedMetadatas, deletedMetadatas in + + Logger.enumeration.info("Finished recursive change enumeration of working set for user: \(self.ncAccount.ncKitAccount, privacy: OSLogPrivacy.auto(mask: .hash)). Enumerating items.") + FileProviderEnumerator.completeChangesObserver(observer, + anchor: anchor, + ncKit: self.ncKit, + newMetadatas: newMetadatas, + updatedMetadatas: updatedMetadatas, + deletedMetadatas: deletedMetadatas) + } return } else if enumeratedItemIdentifier == .trashContainer { Logger.enumeration.debug("Enumerating changes in trash set for user: \(self.ncAccount.ncKitAccount, privacy: OSLogPrivacy.auto(mask: .hash))") @@ -406,14 +408,23 @@ class FileProviderEnumerator: NSObject, NSFileProviderEnumerator { observer.finishEnumeratingChanges(upTo: anchor, moreComing: false) } - private static func fullRecursiveScanForChanges(ncAccount: NextcloudAccount, ncKit: NextcloudKit) -> (newMetadatas: [NextcloudItemMetadataTable], updatedMetadatas: [NextcloudItemMetadataTable], deletedMetadatas: [NextcloudItemMetadataTable]) { + private static func fullRecursiveScanForChanges(ncAccount: NextcloudAccount, ncKit: NextcloudKit, completionHandler: @escaping(_ newMetadatas: [NextcloudItemMetadataTable], _ updatedMetadatas: [NextcloudItemMetadataTable], _ deletedMetadatas: [NextcloudItemMetadataTable]) -> Void) { let rootContainerDirectoryMetadata = NextcloudDirectoryMetadataTable() rootContainerDirectoryMetadata.serverUrl = ncAccount.davFilesUrl rootContainerDirectoryMetadata.account = ncAccount.ncKitAccount rootContainerDirectoryMetadata.ocId = NSFileProviderItemIdentifier.rootContainer.rawValue - return scanRecursivelyForChanges(rootContainerDirectoryMetadata, ncAccount: ncAccount, ncKit: ncKit) + // Create a serial dispatch queue + let dispatchQueue = DispatchQueue(label: "recursiveChangeEnumerationQueue", qos: .background) + + dispatchQueue.async { + let results = scanRecursivelyForChanges(rootContainerDirectoryMetadata, ncAccount: ncAccount, ncKit: ncKit) + + DispatchQueue.main.async { + completionHandler(results.newMetadatas, results.updatedMetadatas, results.deletedMetadatas) + } + } } private static func scanRecursivelyForChanges(_ directoryMetadata: NextcloudDirectoryMetadataTable, ncAccount: NextcloudAccount, ncKit: NextcloudKit) -> (newMetadatas: [NextcloudItemMetadataTable], updatedMetadatas: [NextcloudItemMetadataTable], deletedMetadatas: [NextcloudItemMetadataTable]) { -- 2.30.2