使用 Web 服务获取 CoreData 背景?

Posted

技术标签:

【中文标题】使用 Web 服务获取 CoreData 背景?【英文标题】:CoreData Background Fetch with Webservice? 【发布时间】:2016-01-10 01:27:03 【问题描述】:

我想在后台更新我设备上的一些数据。例如:

我会得到一个 web 服务,它会返回一些我需要存储到我的核心数据中的更改。所以我的目标是用 Alamofire 加载 JSON 数据,遍历我所有的 json 对象,并将它们存储到我的数据库中。当一切都完成后,我想更新我的 UI。

更改可能有数百行,所以我想在后台线程上执行此操作。生病时使用:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^
   var context = appDel.managedObjectContext
   do 
        tasks = try context.executeFetchRequest(fetchRequest) as! [Tasks]
    
    catch 
        fatalError("Fetching from the store failed")
    

    for task in tasks 
       // check something here, or set some new values
    

    // save them in background? But how do i know if save is completed?

    dispatch_async(dispatch_get_main_queue()) 
       // update my UI
    


);

这一切会在后台运行,还是我需要多个上下文?我会在其他地方读到,当我在线程中加载我的 managedObjectContext 时,整个 Fetch 在后台运行。我怎么知道我的上下文何时完成保存,以便我可以刷新我的 UITableView?

提前致谢!

【问题讨论】:

你不是指 ios 7 Background Fetch 对吧? 【参考方案1】:

    你应该在context.performBlock 而不是dispatch_async中执行后台代码

    完成后致电completionHandler(.NewData)

【讨论】:

感谢您的回答。所以如果我在街区内,一切都在后台运行吗?我的 Web 服务请求已经在后台运行,我可以在 dispatch_async 中创建一个 performBlock 吗? 是的 - 在后台运行代码,在与您的托管对象上下文关联的队列上 - 这在处理核心数据时是必要的。 dispatch_async 将使用不同的队列,这会导致您的应用在尝试访问 Core Data 对象时崩溃)

以上是关于使用 Web 服务获取 CoreData 背景?的主要内容,如果未能解决你的问题,请参考以下文章

将 CoreData 更改推送到 Web 服务的最佳实践?

使用 Swift 3.0 将 CoreData 保存到 Web 服务器

使用 CoreData 时 RestKit 没有正确映射属性

CoreData 多线程死锁

使用 RestKit 和 CoreData 同步修改对象的正确方法

如何在 segue 中从 CoreData 获取结果