Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS从服务器同步json对象列表_Ios_Objective C_Json_Swift_Core Data - Fatal编程技术网

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

iOS从服务器同步json对象列表,ios,objective-c,json,swift,core-data,Ios,Objective C,Json,Swift,Core Data,我希望将http请求结果与我的核心数据数据库同步。例如,非常基本的类: class Category: NSManagedObject { @NSManaged var id: NSNumber @NSManaged var name: String @NSManaged var imageUrl: String } 我有一个从请求中获取结果的方法: apiManager.getRequestJsonParse(Constants.Server.Backend

我希望将http请求结果与我的核心数据数据库同步。例如,非常基本的类:

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(类似CD的核心数据),首先我将json解析为Category类,而不是所有类别,我检查任何CategoryCD(保存在CD中)是否具有相同的Id,然后进行更新、添加或其他操作

现在我在想,如果有更好的方法,我该怎么做。每次下载新结果时,我都可以删除该类的数据库,然后添加所有结果。这种方法的问题是,如果我想保留某些类的内容,该怎么办。就像我下载并保存图像一样,我宁愿在类和保存的图像之间保持连接

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


你用什么做这个?我认为这是很常见的问题。您有项目列表,我希望它们可以脱机使用(使用我以前下载的所有数据),但当我连接到internet时,我希望更新新的结果(不是从服务器下载所有内容,而是我请求的响应)

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

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
}

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

不要创建两个对象,因为这是多余的。作为解析的一部分,只创建核心数据对象

标准JSON解析如下所示:

  • 使用NSJSONSerializer转换为对象
  • 使用KVO从JSON对象获取所有唯一ID
  • 基于uniqueid从核心数据获取所有现有对象
  • 插入当前不存在的所有对象
  • 如果要更新对象,则#4可以同时执行这两项操作


    在Stackoverflow上搜索,你会发现很多这样做的例子。

    该代码的性能会非常糟糕。您正在对每个单独的对象进行提取,以确定它是否存在。这是N次磁盘点击。相反,您应该使用KVO从传入的JSON获取所有uniqueid,并为现有对象对磁盘执行一次调用。然后你可以重复。@MarcusS.Zarra哦,我知道。但是,这是针对单个条目的。我相信op可以调整代码以满足他的需要。当您编写这样的示例时,您最终看到的代码只是在这个方法上迭代。最好从一开始就清楚这一点的危险性,以免OP抱怨CD慢…;-)@马库斯·扎拉将来会。谢谢你:)我错了。我是说KVC。您可以使用
    valueForKeyPath:
    来聚合uniqueid。