mirror of
https://github.com/nextcloud/desktop.git
synced 2024-10-24 05:15:40 +03:00
Make enumeration of working set changes non-blocking in FileProviderEnumerator
Signed-off-by: Claudio Cambra <claudio.cambra@nextcloud.com>
This commit is contained in:
parent
60005d89bc
commit
ccad81949a
1 changed files with 20 additions and 9 deletions
|
@ -246,14 +246,16 @@ class FileProviderEnumerator: NSObject, NSFileProviderEnumerator {
|
||||||
if enumeratedItemIdentifier == .workingSet {
|
if enumeratedItemIdentifier == .workingSet {
|
||||||
Logger.enumeration.debug("Enumerating changes in working set for user: \(self.ncAccount.ncKitAccount, privacy: OSLogPrivacy.auto(mask: .hash))")
|
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.fullRecursiveScanForChanges(ncAccount: self.ncAccount, ncKit: self.ncKit) { newMetadatas, updatedMetadatas, deletedMetadatas in
|
||||||
|
|
||||||
FileProviderEnumerator.completeChangesObserver(observer,
|
Logger.enumeration.info("Finished recursive change enumeration of working set for user: \(self.ncAccount.ncKitAccount, privacy: OSLogPrivacy.auto(mask: .hash)). Enumerating items.")
|
||||||
anchor: anchor,
|
FileProviderEnumerator.completeChangesObserver(observer,
|
||||||
ncKit: self.ncKit,
|
anchor: anchor,
|
||||||
newMetadatas: scanResults.newMetadatas,
|
ncKit: self.ncKit,
|
||||||
updatedMetadatas: scanResults.updatedMetadatas,
|
newMetadatas: newMetadatas,
|
||||||
deletedMetadatas: scanResults.deletedMetadatas)
|
updatedMetadatas: updatedMetadatas,
|
||||||
|
deletedMetadatas: deletedMetadatas)
|
||||||
|
}
|
||||||
return
|
return
|
||||||
} else if enumeratedItemIdentifier == .trashContainer {
|
} else if enumeratedItemIdentifier == .trashContainer {
|
||||||
Logger.enumeration.debug("Enumerating changes in trash set for user: \(self.ncAccount.ncKitAccount, privacy: OSLogPrivacy.auto(mask: .hash))")
|
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)
|
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()
|
let rootContainerDirectoryMetadata = NextcloudDirectoryMetadataTable()
|
||||||
rootContainerDirectoryMetadata.serverUrl = ncAccount.davFilesUrl
|
rootContainerDirectoryMetadata.serverUrl = ncAccount.davFilesUrl
|
||||||
rootContainerDirectoryMetadata.account = ncAccount.ncKitAccount
|
rootContainerDirectoryMetadata.account = ncAccount.ncKitAccount
|
||||||
rootContainerDirectoryMetadata.ocId = NSFileProviderItemIdentifier.rootContainer.rawValue
|
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]) {
|
private static func scanRecursivelyForChanges(_ directoryMetadata: NextcloudDirectoryMetadataTable, ncAccount: NextcloudAccount, ncKit: NextcloudKit) -> (newMetadatas: [NextcloudItemMetadataTable], updatedMetadatas: [NextcloudItemMetadataTable], deletedMetadatas: [NextcloudItemMetadataTable]) {
|
||||||
|
|
Loading…
Reference in a new issue