ObjectMapper + Realm + Alamofire

时间:2016-05-23 18:40:26

标签: swift realm alamofire objectmapper

我使用ObjectMapper映射我的对象,这些对象由Alamofire提供,并将它们保存在Realm中。

Everthing工作正常。但是,如何删除Realm中存在但已在我的Web服务中删除的对象?

更新:根据以下答案,我目前以此代码结束:

 if let overviewItemsArray = response.result.value{

                    do{
                        try self.realm.write{
                            self.realm.delete(self.realm.objects(OverviewItem))
                            self.realm.add(overviewItemsArray, update: true)
                        }
                    }
                    catch let err as NSError {
                        logger.error("Error with realm: \(err.localizedDescription)")
                    }
                    overviewItemsAsList.removeAll()
                    overviewItemsAsList.appendContentsOf(self.realm.objects(OverviewItem)
                        .sorted("sortOrder", ascending: true))
                    successHandler(overviewItemsAsList)
                }

也许有人进一步提出如何改进这一点。我有10个这种类型的对象。但在其他物体上,我得到1500件物品。

3 个答案:

答案 0 :(得分:1)

我终于明白了它并且效果很好。我计算缓存数据和新数据的差异并删除它:

private func deleteOrphans(existingData: List<VotingHeader>, fetchedData:[VotingHeader]){

        guard existingData.count>0 else {
            return
        }

        let existingIDs = Set(existingData.map({$0.votingID}))
        let incomingIDs = fetchedData.map({$0.votingID})
        let idsToDelete = existingIDs.subtract(incomingIDs)

        if idsToDelete.count>0{
            let itemsToDelete =  self.realm.objects(VotingHeader).filter("votingID IN %@",idsToDelete)

            try! self.realm.write{
                self.realm.delete(itemsToDelete)
            }
        }
    }

答案 1 :(得分:0)

你可以:

- 使用updated_at字段并通过id更新该字段,之后删除所有尚未更新的对象或

- 删除所有对象,然后插入新对象(昂贵,我不会做这样的事情)

我认为您应该选择第一个选项,特别是如果您有大量数据,当您从Web服务获得响应时,通过每个选项并使用NSDate()更新数据库中的相应记录,然后删除对象是“老”。请注意,这不是来自服务器的updated_at,而是您的本地存储。

如果您拥有少量数据并且您确信它会快速便宜,那么另一个就没问题了。

答案 2 :(得分:0)

这听起来像你需要实现某种机制来确定哪些对象在服务器上被删除,并明确地将这些信息转发给你的本地设备以反映这种变化。我可以想到一些可能的解决方案:

  • 如果您可以控制API,则可以实现一个系统,其中您的设备告诉服务器上次调用API的时间戳,然后服务器可以在其响应中返回ID号列表对于在此之后删除的条目。

  • 如果您每次只是简单地下载相同的列表,而不是每次都清除Realm文件中的所有内容,请执行Realm文件中每个条目的手动循环,看看它是否有相应的下载列表中的条目。如果没有,删除它。当然,这仍然是一个相对较慢的操作,但它比每次删除/重新创建所有内容要快得多。

  • 由于听起来Realm在这里用于缓存服务器信息,你可以在Realm对象上设置一个非常严格的到期时间,如果超出它就会删除它们,或者如果从中刷新对象则扩展它服务器。

我希望有所帮助!