You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何避免已删除的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 00:05:48