[英]Concurret fetch request in Core Data
我的应用程序使用Alamofire通过对服务器的异步请求获取JSON中的数据。 我需要执行以下操作:
1.执行多个提取请求并接收JSON数据
2.将JSON数据发送到我的DataImporter
类,以导入到Core Data中
DataImporter类必须执行以下操作:
1.将JSON转换为NSManagedObject
数组,以存储到Core Data中
2.从核心数据中获取当前的管理对象
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用法正确吗? 我是否需要将提取请求和导入分为两个单独的方法?
- 这是从Web服务导入数据的有效方法吗?
是的,与Alamofire并发执行这些请求一样高效。
但是,有机会对其进行改进:
如果加载的JSON大且带宽是限制因素,则按顺序执行请求可能很有意义。 这样的结果是,第一个请求更快地完成,并且第二阶段(DataImporter)可以更快地使用数据,并且所有后续请求在更均匀的分布时间内完成。 请注意,导入只能顺序处理JSON。 由于受管对象的执行上下文(串行分派队列),它只能使用一个 CPU。
如果您改为并行下载所有数据,它们可能会在大约同一时间全部到达,但是数据导入器一次只能提供一个数据。 因此,顺序加载它们可以改进此方法。
- 我应该为Alamofire请求使用其他队列吗?
您根本无法更改网络请求的基础工作线程。 您可以(可能)设置的是将在其中执行委托的调度队列。 此队列不应为main_queue。 如果可以在Alamofire中配置全局并发队列,请选择它。
- 我对并发MOC的用法正确吗?
据我所知,是的。 但是,我会向方法importArticles
添加完成处理程序,因为它是异步函数。
我是否需要将提取请求和导入分为两个单独的方法?
您正在网络请求的完成处理程序中调用importArticles
表单-完全可以。 除非您使用诸如Promises或Futures之类的帮助程序类,否则这是您必须采取的方法。
恕我直言,在您的情况下,利用暴露“ Future”或“ Promise”的库或任何“ Rx”库的解决方案可能会使您的代码更易理解。 它还有助于以简洁的方式实现错误处理和消除。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.