iOS从服务器同步对象的json列表

Posted

技术标签:

【中文标题】iOS从服务器同步对象的json列表【英文标题】:iOS synchronize json list of objects from server 【发布时间】:2015-05-28 15:37:00 【问题描述】:

我希望将 http 请求结果与我的 Core Data 数据库同步。例如非常基础的类:

class Category: NSManagedObject 

    @NSManaged var id: NSNumber
    @NSManaged var name: String
    @NSManaged var imageUrl: String

我有这种方法可以从请求中获取结果:

    apiManager.getRequestJsonParse(Constants.Server.BackendUrl + "categories?lang=cs", completion:  (result, error) -> Void in

        completion(categories: [], error: error)
    )

结果是从 json 解析的字典。没关系,但现在我想将字典解析到我的类,检查数据库中是否存在,是否存在更新属性,如果不存在则向数据库添加新类别。

我之前在应用程序中使用的方法是我有两个类:Category 和 CategoryCD(类似于 Core Data 的 CD),首先我将 json 解析为 Category 类,而不是检查所有类别是否有 CategoryCD(保存在 CD 中)具有相同的 Id 然后更新,或添加或其他东西。

现在我正在考虑是否有更好的方法可以做到这一点。每次下载新结果时,我都可以删除该类的数据库,然后添加所有结果。这种方式的问题是,如果我有一些我想保留的课程怎么办。就像如果我下载并保存图像,那么我宁愿在课程和保存的图像之间保持联系。

我正在考虑我的旧方法,但将 2 个几乎相同的类(1 个用于核心数据,1 个相同但用于解析)减少到 1 个核心数据类。但是当我初始化这个类时,我必须总是在数据库中创建一个问题,对吗?所以它可能很复杂。

你用什么来做这个?我认为这是非常普遍的问题。你有项目列表,我想让它们离线可用(我之前下载的所有数据)但是当我连接到互联网时,我想用新结果更新(不是从服务器下载全部,只是我要求的响应) .

【问题讨论】:

【参考方案1】:

这是一个非常普遍的问题,已经解决了数百种方法。顺便说一句,这不是“同步”,而是“缓存”以供离线使用。

不要创建两个对象,因为那是多余的。仅创建 Core Data 对象作为解析的一部分。

标准的 JSON 解析如下所示:

    使用 NSJSONSerializer 转换为对象。 使用 KVO 从 JSON 对象中获取所有唯一 ID 根据 uniqueID 从 Core Data 获取所有现有对象 插入当前不存在的所有对象

如果您要更新对象,那么 #4 会同时进行。

在 *** 上搜索,您会发现很多关于如何做到这一点的示例。

【讨论】:

【参考方案2】:

我在我的一个应用中做了类似的事情。 这是一些获取项目并更新它的通用代码。如果它不存在,它会创建它。

func insertOrUpdateManagedObject(id: Int16, name: String) -> YourManagedObject? 
  var managedObject: YourManagedObject?
  if let context = self.managedObjectContext 
    if let fetchResult = fetchManagedObjectWithId(id) 
      managedObject = fetchResult
      managedObject?.name = name
    
    else 
      managedPhrase =   NSEntityDescription.insertNewObjectForEntityForName("YourManagedObject", inManagedObjectContext: context) as? YourManagedObject
      managedObject?.id = id
      managedObject?.name = name
    
  

  println("Created a managed object \(managedObject)")
  return managedObject

【讨论】:

该代码的性能会很糟糕。您正在为每个单独的对象进行提取以确定它是否存在。那是对磁盘的 N 次命中。相反,您应该使用 KVO 从传入的 JSON 中获取所有唯一 ID,并对现有对象执行 ONE 调用磁盘。然后你就可以迭代了。 @MarcusS.Zarra 哦,我知道这一点。但是,这是针对单个条目的。我确信操作员可以调整代码以满足他的需求 当您编写这样的示例时,您最终会看到仅迭代此方法的代码。最好从一开始就清楚这样做的危险,以免 OP 抱怨 CD 很慢...... ;-) @MarcusS.Zarra 将在未来。谢谢你:) @Lytic,我的错误。我的意思是KVC。您可以使用 valueForKeyPath: 来聚合 UniqueID。

以上是关于iOS从服务器同步对象的json列表的主要内容,如果未能解决你的问题,请参考以下文章

使用 RestKIt 在核心数据实体中映射 json 对象

与同步服务器 API 的比较

ios开发——如何做JSON解析器?

在 iOS 中保存 JSON 对象

从 ASP.Net Web 服务 json 输出中删除“d”对象

将数据从 PHP 脚本发送到 iOS