【问题标题】:How to use Core Data synchronously?如何同步使用 Core Data?
【发布时间】:2014-11-17 20:52:13
【问题描述】:

我正在尝试使用 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() 当前返回一个硬编码的空数组,我没有找到如何同步选择所有 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&lt;T&gt;),但我找不到如何在 Swift 中执行此操作。 当我在 NewsEntity 类中覆盖 equals 和 hashcode 时出现异常。

在继续之前,这样做是否正确? 如果是的话,有什么好的教程可以演示如何做到这一点? 如果没有正确的方法是什么?

【问题讨论】:

  • 我的回答没有帮助吗?

标签: ios json core-data swift


【解决方案1】:

通常核心数据事务应始终在对象的托管对象上下文线程上执行。因此,您将在NSManagedObjectContext 中看到performBlockperformBlockAndWait 调用。

由于您使用的是主线程,因此您在技术上是同步的,假设您在主线程上进行这些更新调用。如果您不是,那么我建议您将同步呼叫包装到 performBlockAndWait 呼叫中。

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

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

  • 无效
  • 级联
  • 无操作
  • 拒绝

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

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

编辑

顺便说一句,您可能会发现 Ray Wenderlich 提供了一些很棒的 Core Data Tutorials

【讨论】:

  • Apple 的核心数据编程指南不包括队列限制(performBlock 等)或嵌套上下文。如果你使用 performBlockAndWait: 你应该知道它和 performBlock: 之间的区别: quellish.tumblr.com/post/93355099502/…
猜你喜欢
  • 2011-11-08
  • 2012-05-14
  • 2015-10-08
  • 2017-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-31
相关资源
最近更新 更多