我正在使用RestKit框架,我想发出POST HTTP请求。响应为JSON。我想将JSON响应自动放入CoreData中。

我不知道到底该调用什么方法来发出请求。我知道我应该使用RKObjectManager的方法,但是找不到合适的方法。

我找到了postObject:delegate:这个方法,但是我没有将什么对象作为参数传递。
我也在文档:loadObjectsAtResourcePath:usingBlock:中找到此方法,但由于它告诉我而无法使用:

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

最佳答案

弗拉德-首先,让我们为您的原始问题提供一个答案:

我假设您正在使用RestKit 0.20.0,但是熟悉RestKit 0.10.x API并正在咨询过时的信息。您应该转到的第一个地方是RKObjectManager.h- header 始终是最新的,并将包含有关可用方法的文档。接下来,您始终可以查看从the latest API docs site上的源代码构建的最新文档。

您要在此处创建一个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:。 RestKit Github网站上的README.md和 header 文档中还有其他示例,并且在单元测试中还有大量的代码可供引用。

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

哎呀,出于多种原因,这是一个非常糟糕的答案。 (免责声明:我是RestKit的主要开发人员)

首先,您使用的是RestKit的哪个版本?如果您使用的是最新版本(即0.20.x预发行系列),则用于加载对象集合的方法已替换为更好的名称:getObjectsAtPath:。 API文档(Making Requests by Path)和0.10 to 0.20 migration guide中都对此进行了全面记录。

我怀疑这里的原始问题源于引用过时的文档以及最新的代码。

接下来,您推荐的技术栈是,而设置和使用起来要复杂得多,一旦您真正理解该库,它们就可以完成RestKit为您提供的功能。

让我们逐点看一下:
  • AFNetworking
  • AFN是一个出色的轻量级库,用于执行异步联网操作。如果您将RestKit视为包含许多用于实现客户端API的工具的工具箱,那么AFN无疑是无价之宝。
  • 我非常尊重AFN,在RestKit 0.20.x中,我们抛弃了老化的自制网络库,转而支持AFNetworking,因为它的设计优于自iOS 3.0以来一直存在的RestKit自定义网络堆栈。但是,仅AFN并不能为您提供足够的火力来完全实现与Core Data集成的API,而又不具备对Core Data的深入了解并自己实现大量的同步代码。
  • RestKit的对象映射系统为您提供了高性能,一致的API,用于配置这些同步 Activity ,而无需您自己实现。这样可以进行一些严重的性能优化,我将在稍后进行介绍。
  • JSONKit
  • JSONKit是另一个我高度评价的库,但可能不值得您花时间。与NSJSONSerialization相比,JSONKit的JSON解析速度更高-但仅毫秒。
  • 作为为广泛部署的应用程序实现了大型API客户端的人,我可以告诉您,您的时间不会花在JSON序列化/反序列化上,而是花在对JSON进行反序列化后用于处理JSON的代码中。
  • MagicalRecord
  • MagicalRecord是一个Core Data便捷库,它为Core Data中的现有功能提供了快捷方式访问器。一旦您掌握了实现HTTP到核心数据同步方案真正需要的一切,它就不会改善您的生活。您的问题将与无关,与无关,这与核心数据获取请求的语法过于冗长,维护对托管对象上下文的引用或获取核心数据堆栈设置不方便有关。

  • 因此,让我们来谈一谈的实际问题在实现将API建模为Core Data的iOS/OS X应用程序中存在哪些问题:
  • 异​​步访问
  • 您将要遇到的第一个问题是,您习惯于以同步,面向主线程的方式进行编程,但是现在您需要触发一个AFNetworking请求来加载JSON,然后再将其加载到对象模型中。没问题,只需等待AFJSONRequestOperation在成功模块中击中您并更新Core Data,对吗?错误的。现在,您正在异步执行网络I/O,然后执行 CPU密集任务来更新主线程上的数据模型。现在,您的应用程序性能糟透了,您不知道该怎么办。您如何将同步移到后台?完成后如何通知UI?
  • 错误处理
  • 遇到错误时会发生什么?遇到网络错误时该怎么办?网络操作完成后,如果您在访问核心数据时遇到错误,该怎么办?您将如何处理?您是否要将这个错误处理代码放入所有 Controller 中?您将如何封装所有这些逻辑?
  • 您将如何处理服务器返回的错误?
  • 唯一对象标识
  • 好吧,现在您已经加载了JSON,并希望将其放入Core Data中。伟大的。您如何区分商店中的现有对象与需要创建的新对象?
  • 如果弄错了,现在您有重复的对象。
  • 如果您这样做正确,但是在主线程上下文中执行此操作,则UI会被阻塞,并且性能会降低。
  • 如果您这样做正确,但是在后台线程上执行,则可能存在并发问题。
  • 如果您做对了,但是由于获取请求而访问了持久存储,以标识您的唯一对象,那么您现在就遇到了性能问题。
  • 删除孤立对象
  • 将数据集与服务器同步后,如何处理从本地存储中删除服务器上不再存在的死对象?
  • 性能
  • 正如我在本报告的较早部分提到的那样,所有道路最终都将导致性能提高。如果您实际上是在尝试构建可以使用户满意并能使用户满意的东西,那么您将不得不应对严重的性能问题。头晕

  • 一旦您的应用程序成功,您还需要解决许多其他问题,包括可测试性,可维护性等。您对这些事情有多大的想法?

    我想我的主要观点是(从我的角度来看)太普遍了,以至于听不到花生画廊关于如何解决基本工程问题的疯狂欢呼。现实情况是,对于本质复杂性的问题的解决方案将具有相对于所解决问题的学习曲线。

    与尝试解决更大但更有趣的问题相比,采用离散的功能和确定令人满意的解决方案要容易得多。

    但这并不意味着您将通过捆绑一堆库来产生一个更强大的解决方案,您所听到的这些库提供了对问题子集的良好实现,而不是对聚合问题的更大解决方案。

    为什么没有人开源他们自己的AFN/JSONKit/Core Data/MagicalRecord mashup并把RestKit吹牛了,如果它们比RestKit好得多呢?

    恐怕清醒的事实是:这不是那么容易。

    干杯!

    关于ios - 尝试使用RestKit发出POST请求并将响应映射到Core Data,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13962109/

    10-14 22:35