繁体   English   中英

核心数据中的并发获取请求

[英]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用法正确吗? 我是否需要将提取请求和导入分为两个单独的方法?

  1. 这是从Web服务导入数据的有效方法吗?

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

但是,有机会对其进行改进:

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

如果您改为并行下载所有数据,它们可能会在大约同一时间全部到达,但是数据导入器一次只能提供一个数据。 因此,顺序加载它们可以改进此方法。

  1. 我应该为Alamofire请求使用其他队列吗?

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

  1. 我对并发MOC的用法正确吗?

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

我是否需要将提取请求和导入分为两个单独的方法?

您正在网络请求的完成处理程序中调用importArticles表单-完全可以。 除非您使用诸如Promises或Futures之类的帮助程序类,否则这是您必须采取的方法。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM