尝试使用RestKit创buildPOST请求并将响应映射到Core Data

我正在使用RestKit框架,我想做一个POST HTTP请求。 响应是JSON。 我想将JSON响应自动放入CoreData中。

我不确切地知道用什么方法来提出请求。 我知道我应该使用RKObjectManager的方法,但是我没有find正确的方法。

我发现这个方法postObject:delegate:但我不是什么对象作为parameter passing。 我也在文档中find这个方法: loadObjectsAtResourcePath:usingBlock:但我不能使用它,因为它告诉我:

 No visible @interface for 'RKObjectManager' declares the selector 'loadObjectsAtResourcePath:usingBlock:' 

弗拉德 – 首先,让我们得到你原来的问题的答案:

我假设你正在使用RestKit 0.20.0,但熟悉RestKit 0.10.x API并正在咨询过时的信息。 你应该转向的第一个地方是RKObjectManager.h – 标题总是最新的,并将包含有关可用方法的文档。 接下来,您可以随时在最新的API文档网站上查看源代码构build的最新文档 。

你想在这里做的是创build一个RKObjectRequestOperation

 NSDictionary *dictionary = @{ @"firstParam": @(12345), @"secondParam": @"whatever"}; NSMutableURLRequest *request = [objectManager requestWithObject:nil method:RKRequestMethodPOST path:@"/whatever" parameters:parameters]; RKObjectRequestOperation *operation = [objectManager objectRequestOperationWithRequest:request success:^(RKObjectRequestOperation *operation, RKMappingResult *result) { NSLog(@"Loading mapping result: %@", result); } failure:nil]; 

如果你试图定位核心数据,那么你会想使用RKManagedObjectRequestOperationmanagedObjectRequestOperationWithRequest:success:failure: RKManagedObjectRequestOperation 在RestKit Github网站的README.md中还有一些额外的例子,在头文件中也有一些代码在unit testing中供参考。


接下来,针对JRG-Developer的评论:

嗯,这是一个非常可怕的答案,原因有很多。 (免责声明:我是RestKit的主要开发者)

首先,你使用的是什么版本的RestKit? 如果您正在使用最新版本(即在0.20.x预发行版系列中),那么加载对象集合的方法已被更好的名称replace: getObjectsAtPath: 这在API文档( 按path发送请求 )和0.10到0.20迁移指南中都有详细logging。

我怀疑这里最初的问题是因为提到过时的文档和最近的代码。

接下来,一旦您真正了解了库,那么您推荐的一堆技术要设置和使用才能完成RestKit为您提供的相同的function。

我们来看一下这一点:

  1. AFNetworking

    • AFN是一个用于执行asynchronousnetworking操作的优秀的轻量级库。 如果你把RestKit看作一个包含许多实现客户端API的工具的工具箱,那么AFN就是重头戏。
    • 我非常尊重AFN,并且在RestKit 0.20.x中,我们抛弃了老化的自制networking库,转而采用AFNetworking,因为它的devise优于自iOS 3.0以来一直悬挂的RestKit定制networking栈。 但是AFN本身并没有提供足够的实力来完全实现一个与Core Data集成的API,而无需对Core Data有深入的了解,并且可以自己实现大量的同步代码。
    • RestKit的对象映射系统为您提供了一个高性能,一致的API来configuration这些同步活动,而不是自己实现它们。 这将启用一些严重的性能优化,稍后我会回头。
  2. JSONKit

    • JSONKit是我高度重视的另一个库,但它可能不值得您花时间。 与NSJSONSerialization相比, NSJSONSerialization的JSONparsing速度是优越的 – 但只有毫秒。
    • 作为为广泛部署的应用程序实现大型API客户端的人,我可以告诉您,您的时间不会用在JSON序列化/反序列化中,而是在您的JSON被反序列化之后处理的代码中。
  3. MagicalRecord

    • MagicalRecord是一个核心数据便利库,为核心数据中的现有function提供速记访问器。 一旦深入了解实现HTTP到核心数据同步scheme所需要的内容,它不会改善您的生活。 您的问题与核心数据提取请求的语法太冗长无关,维护对托pipe对象上下文的引用或获取核心数据堆栈设置不方便。

那么让我们来谈谈实现将API模拟到Core Data中的iOS / OS X应用程序的真正问题

  1. asynchronous访问
    • 你要碰到的第一个问题是你习惯于以同步的,面向主线程的方式进行编程,但是现在你需要发出一个加载你的JSON的AFNetworking请求,然后把它加载到你的对象模型中。 没问题,只是等待AFJSONRequestOperation在成功块中重新找回并更新Core Data,对吧? 错误。 现在,您正在asynchronous执行您的networkingI / O,但之后在主线程上执行了CPU密集型任务,即更新您的数据模型。 现在你的应用性能很糟糕,你不知道该怎么做。 你如何把这个同步到后台? 一旦完成,你如何通知用户界面?
  2. error handling
    • 当你遇到错误时会发生什么? 当你遇到networking错误时,你会怎么做? 当networking操作完成时你做了什么,但是在核心数据访问期间出现错误? 你打算如何处理? 你打算把这个error handling代码放到你所有的控制器中吗? 你将如何封装所有的逻辑?
    • 你将如何处理由服务器返回的错误?
  3. 独特的对象识别
    • 好吧,现在你已经加载了你的JSON,你想把它放到核心数据。 大。 你将如何区分商店内的现有对象与需要创build的新对象?
    • 如果你得到这个错误,你现在有重复的对象。
    • 如果你正确的做到了这一点,但是从主线程的上下文来看,你的用户界面会被阻塞,你的性能很糟糕。
    • 如果你得到这个正确的,但在后台线程上做,你可能会遇到并发问题。
    • 如果你得到了正确的结果,但是通过获取请求来访问持久存储以识别你的独特对象,你现在就会遇到性能问题。
  4. 删除孤立的对象
    • 一旦将数据集与服务器同步,您将如何处理从服务器上不再存在的本地存储中删除死对象?
  5. 性能
    • 正如我在这个咆哮的几个早期部分中提到的,所有的道路最终都会导致performance。 如果你真的想要build立一个能够大规模使用的东西,你将不得不面对严重的性能问题。 晕头转向

一旦你的应用程序成功,你将不得不面对另外一些问题,包括可testing性,可维护性等等。你对这些东西有多想?

我想我的主要观点是(从我的angular度来看),听到花生画廊疯狂的欢呼声或者嘲笑如何解决基本的工程问题是太常见了。 现实情况是,解决复杂性问题的方法将会有一个相对于正在接近的问题的学习曲线。

拿出一个独立的function片段,并找出一个令人满意的解决scheme,远比试图接近一个更大但更有趣的问题要容易得多。

但是,这并不意味着你要通过捆绑一堆你听过的库来提供一个问题的一个子集的很好的实现,而不是一个更大的聚合问题的方法来生成一个更强大的解决scheme。

为什么没有人打开自己的AFN / JSONKit / Core Data / MagicalRecord混搭,如果RestKit比RestKit好得多,就把RestKit从水里吹出来了?

恐怕这个清醒的真相是:它并不那么容易。

干杯!