gpt4 book ai didi

ios - Core Data 中的并发获取请求

转载 作者:行者123 更新时间:2023-11-30 13:39:32 26 4
gpt4 key购买 nike

我的应用程序使用 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. 这是从网络服务导入数据的有效方法吗?
2. 我应该为 Alamofire 请求使用不同的队列吗?
3.我对并发MOC的使用是否正确?我是否需要将获取请求和导入分成两个单独的方法?

最佳答案

  1. Is this an efficient way of importing data from web service?

是的,与 Alamofire 同时执行这些请求一样高效。

但是,还有改进的机会:

如果加载的 JSON 很大并且带宽是限制因素,那么按顺序执行请求可能是有意义的。这样做的效果是,第一个请求更快地完成,第二阶段(DataImporter)可以更快地消耗数据,并且所有后续请求在更均匀分布的时间内完成。请注意,导入只能按顺序处理 JSON。由于托管对象的执行上下文(串行调度队列),它只能使用一个 CPU。

如果您并行下载所有数据,它们可能几乎同时到达,但数据导入器一次只能提供一个数据。因此,按顺序加载它们可能会改进这种方法。

  1. Should I use a different queue for Alamofire request?

您根本无法更改网络请求的底层工作线程。您可以设置(可能)的是执行委托(delegate)的调度队列。该队列不应该是 main_queue。如果可以在 Alamofire 中配置,请选择全局并发队列。

  1. Is my usage of concurrent MOC correct?

据我所知,是的。不过,我会向方法 importArticles 添加一个完成处理程序,因为它是一个异步函数。

Do I need to separate the fetch request and the import into two separate methods?

您正在网络请求的完成处理程序中调用 importArticles 表单 - 这完全没问题。除非您使用 Promises 或 Futures 这样的辅助类,否则您必须这样做。

恕我直言,就您而言,利用公开“Future”或“Promise”的库或任何“Rx”库的解决方案可能会使您的代码更易于理解。它还有助于以简洁的方式实现错误处理和取消。

关于ios - Core Data 中的并发获取请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35727472/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com