diff --git a/Meshtastic/Persistence/UpdateCoreData.swift b/Meshtastic/Persistence/UpdateCoreData.swift index ed5b2af2..32d9bc99 100644 --- a/Meshtastic/Persistence/UpdateCoreData.swift +++ b/Meshtastic/Persistence/UpdateCoreData.swift @@ -156,10 +156,16 @@ extension MeshPackets { nonisolated public func deleteChannelMessages(channel: ChannelEntity, context: NSManagedObjectContext) { do { - let objects = channel.allPrivateMessages + // Copied logic from ChannelEntity.allPrivateMessages, which is always on the MainActor + // But this code may not be on the MainActor. + let fetchRequest = MessageEntity.fetchRequest() + fetchRequest.predicate = NSPredicate(format: "channel == %ld AND toUser == nil AND isEmoji == false", channel.index) + let objects = (try? context.fetch(fetchRequest)) ?? [MessageEntity]() + for object in objects { context.delete(object) } + try context.save() } catch let error as NSError { Logger.data.error("\(error.localizedDescription, privacy: .public)") diff --git a/Meshtastic/Views/Messages/ChannelList.swift b/Meshtastic/Views/Messages/ChannelList.swift index 477a03ed..bf3c2752 100644 --- a/Meshtastic/Views/Messages/ChannelList.swift +++ b/Meshtastic/Views/Messages/ChannelList.swift @@ -162,8 +162,13 @@ struct ChannelList: View { Button(role: .destructive) { Task { await MeshPackets.shared.deleteChannelMessages(channel: channelToDeleteMessages!) - context.refresh(myInfo, mergeChanges: true) - channelToDeleteMessages = nil + await MainActor.run { + context.refresh(channel, mergeChanges: true) + context.refresh(myInfo, mergeChanges: true) + + // Reset state + channelToDeleteMessages = nil + } } } label: { Text("Delete")