如何同步使用Core Data?

时间:2014-09-23 15:12:00

标签: ios json core-data swift

我正在尝试使用Swift制作iOS 8应用程序,我需要从JSON下载数据并保存,但我不了解Core Data机制。 (我来自Android的ORM Lite和Windows Phone的sqlite-net)。

我正在尝试做两个任务,“GetAllNewsTask”从数据库返回所有新闻,“UpdateAllNewsTask”下载JSON并解析它,保存到数据库并返回所有新闻。

函数getEntitiesFromJson将JSON字符串解析为实体对象

class func getEntitiesFromJson(json: JSONValue) -> [NewsEntity]?{
    var rList : [NewsEntity] = []

    var array = json.array
    var countItr = array?.count ?? 0

    if(array == nil){
        return nil
    }

    if(countItr > 0){
        for index in 0...countItr-1{
            var news = NewsEntity()
            var jsonVal = array?[index]

            news.id = jsonVal?["id"].integer ?? 0
            ........

            rList.append(news)
        }
    }

    return rList
}

GetAllNewsTask(newsDao.findAll()当前返回一个harcoded空数组,我没有找到如何同步选择所有NewsEntity)

class GetAllNewsTask:NSOperation {

var result : Array<News>?

override func main() -> (){
    result = executeSync()
}

func executeSync() -> Array<News>? {
    let newsDao = NewsDAO()
    let entities = newsDao.findAll()

    return NewsModel.getVOsFromEntities(entities)
}

UpdateAllNewsTask

class UpdateAllNewsTask:NSOperation {

var result : Array<News>?

override func main() -> (){
    result = executeSync()
}

func executeSync() -> Array<News>? {

    let response = JsonServices.getAllNews()
    var managedObjectContext = (UIApplication.sharedApplication().delegate as AppDelegate).managedObjectContext!
    var entityDescription = NSEntityDescription.entityForName("NewsEntity", inManagedObjectContext: managedObjectContext)
    var entities = NewsModel.getEntitiesFromJson(response)

    //TODO insert new, update existing and remove old

    return GetAllNewsTask().executeSync()
}

我正在尝试添加或更新所有NewsEntity并删除旧的,在Java中使用List.removeAll(Collection<T>)但我无法在Swift中找到如何执行此操作。 当我在NewsEntity类中重写equals和hashcode时,我遇到了异常。

在继续之前,这是正确的方法吗? 如果是,有任何好的教程演示如何做到这一点? 如果没有正确的方法?

1 个答案:

答案 0 :(得分:5)

通常,核心数据事务应始终在对象的托管对象上下文线程上执行。因此,您会在performBlock中看到performBlockAndWaitNSManagedObjectContext来电。

由于您正在使用主线程,因此假设您在主线程上进行了这些更新调用,那么您在技术上是同步的。如果你不是那么我会建议你将同步电话打包成performBlockAndWait电话。

话虽如此,您应该在主题上使用Apple's Documentation,因为它们解释了如何实现多线程核心数据。您应该始终在后台线程上执行与服务器相关的更新。

如果要实现removeAll功能,则需要手动获取要删除的所有对象并调用context.deleteObject(managedObject)。或者,如果您想要更强大的功能来强制执行级联删除,则可以在选择关系时在模型编辑器中进行设置。可以使用以下删除规则:

  • 抵消
  • 级联
  • 无行动
  • 拒绝

最后,您可能会发现this post有助于解释一些常用的核心数据堆栈设置以及每种设置的各种性能。

欢迎来到iOS,祝你好运:)

修改

另外,你可能会发现Ray Wenderlich提供了一些很棒的Core Data Tutorials