2016-03-01 128 views
0

我的应用程序使用Alamofire通过异步请求向服务器提取JSON数据。我需要做到以下几点:
1.不要多取请求和接收JSON数据
2.发送JSON数据,我DataImporter类导入到核心数据核心数据中的并发数据获取请求

的DataImporter类必须做到以下几点:
1。转换JSON成NSManagedObject阵列,用于存储到核心数据
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的使用是否正确?我是否需要将提取请求和导入分为两个单独的方法?

+0

这是什么问题?没有什么不妥。试试吧,看看:D – jarryd

+0

我读过很多文章,我把所有的东西都混在了我的脑海里。我最后一次使用核心数据队列的尝试最终导致意外错误和约束违规。现在我只需要有人来确认这种方式是正确的。 – n0ne

+0

所以CoreData和并发的主要原因是需要为该线程/队列创建一个上下文。这涉及到不能跨线程使用核心数据对象的问题,而是跨线程传递它们的managedObjectId,以便可以获取和使用它们。您还需要注意通知UI或其他对象有关新数据。有一个didSaveNotification可以访问所有更改。这就是为什么NSFetchedResultsController很好,它可以在其观看的对象是fetchRequest时发生更改时自动更新UI。 – jarryd

回答

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

是的,和Alamofire一样高效地执行这些请求。

然而,有改善它一个机会:

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

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

  • 我应该使用Alamofire请求一个不同的队列?
  • 根本不能更改网络请求的基础工作线程。你可以设置(可能)是你的委托将被执行的调度队列。这个队列不应该是main_queue。如果可以在Alamofire中配置,请选择全局并发队列。

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

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

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

    您在网络请求的完成处理程序中调用importArticles窗体 - 这完全没问题。除非你正在使用像Promises或Futures这样的助手类,否则这是你必须去的方式。在你的情况下,利用图书馆暴露“未来”或“承诺”或任何“Rx”库的解决方案,可能会使你的代码更加易于理解。它还有助于以简明的方式实现错误处理和取消。