diff --git a/apple/OmnivoreKit/Sources/Services/InternalModels/InternalLinkedItemLabel.swift b/apple/OmnivoreKit/Sources/Services/InternalModels/InternalLinkedItemLabel.swift index f54cf6f8b..6517fd836 100644 --- a/apple/OmnivoreKit/Sources/Services/InternalModels/InternalLinkedItemLabel.swift +++ b/apple/OmnivoreKit/Sources/Services/InternalModels/InternalLinkedItemLabel.swift @@ -110,9 +110,22 @@ extension Sequence where Element == InternalLinkedItemLabel { var result: [NSManagedObjectID]? context.performAndWait { + // Get currently stored label ids so we can later delete the old ones + let labelsFetchRequest: NSFetchRequest = LinkedItemLabel.fetchRequest() + let existingLabels = (try? labelsFetchRequest.execute()) ?? [] + + let validLabelIDs = map(\.id) + let invalidLinkedItemLabels = existingLabels.filter { !validLabelIDs.contains($0.unwrappedID) } + let labels = map { $0.asManagedObject(inContext: context) } + do { try context.save() + // Delete all existing labels that aren't part of the newly updated list + // received from the server + for linkedItem in invalidLinkedItemLabels { + context.delete(linkedItem) + } logger.debug("labels saved succesfully") result = labels.map(\.objectID) } catch {