2014-09-23 107 views
2

我想用Swift做一个iOS 8应用程序,我需要从JSON下载数据并保存它,但我不明白核心数据机制。 (我来自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时,我得到了一个异常。

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

+0

没有我的回答没有帮助? – 2014-10-08 16:09:32

回答

5

通常应该在对象的Managed Object Context线程上执行Core Data事务。为此,您将在NSManagedObjectContext中看到performBlockperformBlockAndWait调用。

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

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

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

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

最后,你可能会发现this post有用解释一些常用的核心数据堆栈设置和每个的各种表现。

欢迎iOS和好运:)

编辑

顺便说一句,你可能会发现雷Wenderlich提供了一些伟大的Core Data Tutorials

+1

Apple的核心数据编程指南不包括队列限制(performBlock等)或嵌套上下文。如果你使用performBlockAndWait:你应该知道它和performBlock之间的区别:http://quellish.tumblr.com/post/93355099502/performblock-vs-performblockandwait – quellish 2014-09-24 02:38:33