如何避免已删除的Realm对象在API刷新后重新添加?
解决Realm删除对象后API刷新重复添加的问题
是的,你需要用一个集合来记录所有已删除的campaignID,而非单个temptTicker——当前的单个变量只能记住最后一次删除的对象,一旦删除多个条目,之前删除的内容就会在API刷新时被重新添加。下面是具体的修改方案:
1. 替换单个记录为批量删除ID集合
把原有的temptTicker替换成一个存储已删除campaignID的集合,推荐用Set(查找效率更高):
class TickerRealmStorage: RealmStorage, TickerStorage { private var items = RealmSwift.List<Ticker>() // 存储所有已删除的campaignID,假设campaignID为String类型,可根据实际类型调整 private var deletedCampaignIDs = Set<String>() // 其余原有方法... }
2. 修改删除方法,记录已删除的ID
删除ticker时,将对应的campaignID存入集合:
func delete(ticker: Ticker) { guard let campaignID = ticker.campaignID else { return } deletedCampaignIDs.insert(campaignID) try! realm.write { realm.delete(ticker) } }
3. 修改保存方法,跳过已删除的条目
在创建并添加ticker前,先检查当前message的campaignID是否在已删除集合中,若是则直接跳过:
func save(messages: [Message]) { items.removeAll() messages.forEach { message in guard let campaignID = message.campaignID else { return } // 跳过已删除的条目 if deletedCampaignIDs.contains(campaignID) { return } let ticker = Ticker() ticker.campaignID = campaignID ticker.isRead = message.isRead ticker.messageBody = message.body items.append(ticker) } do { try realm.write { // 先清理Realm中已存在的同ID条目,避免重复 let existingTickers = realm.objects(Ticker.self).filter("campaignID IN %@", items.compactMap { $0.campaignID }) realm.delete(existingTickers) realm.add(items) } } catch { fatalError("Failed to save tickers") } }
额外优化建议
- 如果需要APP重启后仍保留已删除记录,可以把
deletedCampaignIDs持久化到Realm中——比如创建一个DeletedTickerRecord对象专门存储已删除的campaignID,每次启动时从Realm读取该集合。 - 原代码中
temptTicker的逻辑存在无效操作:你在save里创建的ticker还未加入Realm就执行删除,这一步没有实际意义,直接跳过即可。
内容的提问来源于stack exchange,提问作者ferryawijayanto
相关产品推荐
相关产品推荐

