我的应用正在使用Alamofire使用对服务器的异步请求来获取JSON中的数据。我需要做以下事项:
1.执行多次获取请求并接收JSON数据
2.将JSON数据发送到我的DataImporter
类以导入Core Data
DataImporter类必须执行以下操作:
1.将JSON转换为NSManagedObject
数组,以存储到核心数据中
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的使用是否正确?我是否需要将获取请求和导入分成两个单独的方法?
答案 0 :(得分:0)
- 这是从Web服务导入数据的有效方式吗?
醇>
是的,与Alamofire同时执行这些请求一样高效。
然而,有机会改善它:
如果加载的JSON很大且带宽是限制因素,那么顺序执行请求可能是有意义的。这样做的结果是,第一个请求完成得更快,第二个阶段 - DataImporter - 可以更快地消耗数据,并且所有后续请求在更均匀分布的时间内完成。请注意,导入只能按顺序处理JSON。它只能使用一个 CPU - 由于托管对象的执行上下文(串行调度队列)。
如果您要并行下载所有数据,它们可能几乎同时到达所有数据,但数据导入器一次只能提供一个数据。因此,按顺序加载它们可以改进这种方法。
- 我应该为Alamofire请求使用不同的队列吗?
醇>
您根本无法更改网络请求的基础工作线程。您可以设置(可能)的是您的委托将被执行的调度队列。此队列不应该是main_queue。如果可以在Alamofire中配置,请选择全局并发队列。
- 我对并发MOC的使用是否正确?
醇>
据我所见,是的。然而,我会向方法importArticles
添加一个完成处理程序,因为它是一个异步函数。
我是否需要将获取请求和导入分成两个单独的方法?
您正在网络请求的完成处理程序中调用importArticles
表单 - 这是完全正常的。除非你正在使用像Promises或Futures这样的助手类,否则这就是你必须要去的方式。
恕我直言,在您的情况下,使用暴露“未来”或“承诺”的库或任何“Rx”库的解决方案可能会使您的代码更易于理解。它还有助于以简洁的方式实现错误处理和取消。