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))")
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]) {