【发布时间】:2016-03-01 15:56:10
【问题描述】:
我的应用正在使用 Alamofire 通过对服务器的异步请求以 JSON 格式获取数据。我需要执行以下操作:
1. 做多个 fetch 请求并接收 JSON 数据
2. 将 JSON 数据发送到我的DataImporter 类以导入 Core Data
DataImporter 类必须执行以下操作:
1. 将 JSON 转换为 NSManagedObject 的数组,用于存储到 Core Data
2.从Core Data中获取当前托管对象
3. 将转换后的对象与获取的对象进行比较,然后更新/删除/添加新对象
4.将状态保存到核心数据
以下是我认为从 ViewController 发送请求的方式:
override func viewDidLoad() {
super.viewDidLoad()
Alamofire.request(.GET, url1)
.responseJSON { response in
switch response.result {
case .Success(let value):
self.dataImporter.importArticles(value)
case .Failure(let error):
print(error)
}
}
Alamofire.request(.GET, url2)
.responseJSON { response in
switch response.result {
case .Success(let value):
self.dataImporter.importArticles(value)
case .Failure(let error):
print(error)
}
}
}
这是我的 DataImporter 类的样子:
class DataImporter {
private var privateMOC:NSManagedObjectContext!
init () {
privateMOC = setupManagedObjectContextWithConcurrencyType(.PrivateQueueConcurrencyType)
}
func importArticles(articlesInJson:JSON) {
self.privateMOC.performBlock { () -> Void in
let articles = self.convertJsonToArticle(articlesInJson)
let fetchedArticles = //return articles using privateMOC
//compare articles and delete/update/add new articles
self.privateMOC.save()
}
}
现在我的问题是:
1. 这是从 Web 服务导入数据的有效方式吗?
2. 我应该为 Alamofire 请求使用不同的队列吗?
3. 我对并发 MOC 的使用是否正确?我是否需要将获取请求和导入分成两个单独的方法?
【问题讨论】:
-
有什么问题?没有什么不妥。试试看:D
-
我已经阅读了很多文章,但我把所有的事情都搞混了。我最后一次尝试将队列与核心数据一起使用最终导致出现意外错误和违反约束。现在我只需要有人确认这种方式是正确的方式。
-
因此,CoreData 和并发的主要内容是该线程/队列需要有一个上下文。这与不能跨线程使用核心数据对象的问题有关,而是跨线程传递它们的 managedObjectId 以便可以获取和使用它们。您还需要注意通知 UI 或其他对象有关新数据的信息。有一个 didSaveNotification,您可以在其中访问所有更改。这就是 NSFetchedResultsController 好用的原因,它可以在其监视的对象发生变化时自动更新 UI 是 fetchRequest。