@@ -21,13 +21,17 @@ public class MaterialisedEnumerationObserver: NSObject, NSFileProviderEnumeratio
2121 static let logger = Logger ( subsystem: Logger . subsystem, category: " materialisedobservation " )
2222 public let ncKitAccount : String
2323 let dbManager : FilesDatabaseManager
24- private let completionHandler : ( _ deletedOcIds: Set < String > ) -> Void
25- private var allEnumeratedItemIds : Set < String > = . init( )
24+ private let completionHandler : (
25+ _ materialisedIds: Set < String > , _ unmaterialisedIds: Set < String >
26+ ) -> Void
27+ private var allEnumeratedItemIds = Set < String > ( )
2628
2729 public required init (
2830 ncKitAccount: String ,
2931 dbManager: FilesDatabaseManager ,
30- completionHandler: @escaping ( _ deletedOcIds: Set < String > ) -> Void
32+ completionHandler: @escaping (
33+ _ materialisedIds: Set < String > , _ unmaterialisedIds: Set < String >
34+ ) -> Void
3135 ) {
3236 self . ncKitAccount = ncKitAccount
3337 self . dbManager = dbManager
@@ -36,11 +40,7 @@ public class MaterialisedEnumerationObserver: NSObject, NSFileProviderEnumeratio
3640 }
3741
3842 public func didEnumerate( _ updatedItems: [ NSFileProviderItemProtocol ] ) {
39- let updatedItemsIds = Array ( updatedItems. map ( \. itemIdentifier. rawValue) )
40-
41- for updatedItemsId in updatedItemsIds {
42- allEnumeratedItemIds. insert ( updatedItemsId)
43- }
43+ updatedItems. map ( \. itemIdentifier. rawValue) . forEach { allEnumeratedItemIds. insert ( $0) }
4444 }
4545
4646 public func finishEnumerating( upTo _: NSFileProviderPage ? ) {
@@ -69,34 +69,46 @@ public class MaterialisedEnumerationObserver: NSObject, NSFileProviderEnumeratio
6969 _ itemIds: Set < String > ,
7070 account: String ,
7171 dbManager: FilesDatabaseManager ,
72- completionHandler: @escaping ( _ deletedOcIds: Set < String > ) -> Void
72+ completionHandler: @escaping (
73+ _ materialisedIds: Set < String > , _ unmaterialisedIds: Set < String >
74+ ) -> Void
7375 ) {
74- let databaseLocalFileMetadatas = dbManager
75- . itemMetadatas
76- . where ( { $0. account == account && $0. downloaded } )
77- . toUnmanagedResults ( )
78- var noLongerMaterialisedIds = Set < String > ( )
76+ let materialisedMetadatas = dbManager. materialisedItemMetadatas ( account: account)
77+ var materialisedMetadatasMap = [ String: SendableItemMetadata] ( )
78+ var unmaterialisedIds = Set < String > ( )
79+ var newMaterialisedIds = Set < String > ( )
7980
80- DispatchQueue . global ( qos: . background) . async {
81- for localFile in databaseLocalFileMetadatas {
82- let localFileOcId = localFile. ocId
81+ materialisedMetadatas. forEach {
82+ materialisedMetadatasMap [ $0. ocId] = $0
83+ unmaterialisedIds. insert ( $0. ocId)
84+ }
8385
84- guard itemIds. contains ( localFileOcId) else {
85- noLongerMaterialisedIds. insert ( localFileOcId)
86+ for enumeratedId in itemIds {
87+ if unmaterialisedIds. contains ( enumeratedId) {
88+ unmaterialisedIds. remove ( enumeratedId)
89+ } else {
90+ newMaterialisedIds. insert ( enumeratedId)
91+ guard var metadata = dbManager. itemMetadata ( ocId: enumeratedId) else {
8692 continue
8793 }
88- }
89-
90- DispatchQueue . main. async {
91- Self . logger. info ( " Cleaning up local file metadatas for unmaterialised items " )
92- for itemId in noLongerMaterialisedIds {
93- guard var itemMetadata = dbManager. itemMetadata ( ocId: itemId) else { continue }
94- itemMetadata. downloaded = false
95- dbManager. addItemMetadata ( itemMetadata)
94+ if metadata. directory {
95+ metadata. visitedDirectory = true
96+ } else {
97+ metadata. downloaded = true
9698 }
99+ dbManager. addItemMetadata ( metadata)
100+ }
101+ }
97102
98- completionHandler ( noLongerMaterialisedIds)
103+ for unmaterialisedId in unmaterialisedIds {
104+ guard var metadata = materialisedMetadatasMap [ unmaterialisedId] else {
105+ continue
99106 }
107+ metadata. downloaded = false
108+ metadata. visitedDirectory = false
109+ dbManager. addItemMetadata ( metadata)
100110 }
111+
112+ completionHandler ( newMaterialisedIds, unmaterialisedIds)
101113 }
102114}
0 commit comments