Core Data中的Concurret获取请求

时间:2016-03-01 15:56:10

标签: ios json swift core-data

我的应用正在使用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的使用是否正确?我是否需要将获取请求和导入分成两个单独的方法?

1 个答案:

答案 0 :(得分:0)

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

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

然而,有机会改善它:

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

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

  
      
  1. 我应该为Alamofire请求使用不同的队列吗?
  2.   

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

  
      
  1. 我对并发MOC的使用是否正确?
  2.   

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

  

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

您正在网络请求的完成处理程序中调用importArticles表单 - 这是完全正常的。除非你正在使用像Promises或Futures这样的助手类,否则这就是你必须要去的方式。

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