Просмотр исходного кода

Make enumeration of working set changes non-blocking in FileProviderEnumerator

Signed-off-by: Claudio Cambra <claudio.cambra@nextcloud.com>
Claudio Cambra 2 лет назад
Родитель
Сommit
ccad81949a

+ 21 - 10
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]) {