【问题标题】:Can I use blocks in asynchronous results with restkit?我可以在 restkit 的异步结果中使用块吗?
【发布时间】:2011-10-21 22:50:40
【问题描述】:

--更新:我决定试试 AFNetworking。尽管 RestKit 有一个非常好的对象映射功能,但网络调用的设计方式让我们有些困难。

我希望就如何组织使用 RestKit 的项目获得一些建议。

我有几个来自存储库类的 REST 调用,其结果被传递给控制器​​。例如,我在从浏览视图控制器调用的存储库类中有一个 getProfile 方法。视图控制器被设置为 get profile 调用的委托,而存储库类被设置为 restkit 调用的委托。

问题是,如果浏览控制器发出多个 get profile 请求,则很难区分哪个结果应该发送给哪个委托函数,因为所有 restkit 调用共享相同的委托方法 objectLoaderDidFinishLoading。然后我有 4 个委托,我必须匹配 4 个异步 restkit 请求的结果。

有什么方法可以使用块,以便我可以在 asnynrhounous 结果返回时传递一个函数来执行,以便我可以分配一个适当的委托?我看到的块支持允许在请求被发送到 rest kit 之前使用一个块,但我有兴趣在返回异步结果时使用它。

检查结果或设置用户数据并侦查委托与异步结果的替代方法似乎不可靠且庞大。

【问题讨论】:

  • 你见过这个吗? github.com/gowalla/AFNetworking
  • 嗨 Colin,它看起来很有趣,但我们已经在 RestKit 上投入了大量工作,并且也在使用它的对象映射......
  • 嗨 Colin,我很好奇,AFNetworking 是否支持 json 到对象的映射?
  • 我相信确实如此,因为它依赖于 RESTKit。如果没有,那自己也不难;有很多图书馆可以做到这一点。

标签: objective-c asynchronous objective-c-blocks restkit


【解决方案1】:

您可以通过使用 RKObjectLoader 上的 userData 不透明指针来解决您的配置文件请求之间的歧义消歧问题。这将允许您在请求上悬挂您想要的任何对象,然后可以用来帮助区分多个配置文件请求。此外,如果这些配置文件请求将发送到不同的资源路径,那么您可以使用 RKObjectLoader 上的 wasSentToResourcePath: 方法来区分它们。

【讨论】:

  • 我不想使用 userData 因为它们基本上包含相同的相同信息,例如如果我从 4 个不同的来源为同一个配置文件调用 getProfile,它们都将具有相同的用户数据。通过跟踪哪些用户数据去哪里,有一些可行的解决方法,但它看起来很庞大.. 很多 switch 和 if else 语句用于类似的休息套件请求。
  • 嗯,如果您将 userData 与源相关联,则它不会具有相同的数据,这就是 @jeffarena 的意思。将 UUID 作为 userData 存储在 RKObjectLoader 中,并将相同的 UUID 用作其值是源的字典键。这样可以很容易地消除响应的歧义。
【解决方案2】:

我在尝试为我自己的 REST 接口解决这个问题时偶然发现了这个问题。我很高兴我做到了,我现在可能会使用 RestKit。

我跑题了,回到你的问题。正如您所指出的,RKObjectManager 中的 block 参数似乎并不是要以这种方式使用。相反,如何编写一个实现 RKObjectLoaderDelegate 的类,接收一个块,并在任何委托调用上调用该块。

也许是这样的?

@interface MyObjectLoaderDelegate : NSObject <RKObjectLoaderDelegate>

@property (nonatomic, copy) void (^callback)(RKObjectLoader *loader, NSDictionary *objectDictionary, NSError *error)

- (id)initWithCallback:(void (^)(RKObjectLoader*, NSDictionary*, NSError*)aCallaback;

@end

并且在任何已实现的委托方法上,您都可以执行该块。由于块保留了作用域变量,因此您可以针对调用委托运行代码。

你怎么想?

【讨论】:

  • 有趣的方法,我尝试了它的一个版本,但由于我没有对 MyObjectLoaderDelegate 的强引用而遇到错误。我的 repo 类基本上有一个 objectloaderdelegate 工厂,我用它来设置为 rest kit 调用的委托。不幸的是,restkit 不保留对委托的引用,并且在对象加载时不再引用自定义加载器委托。无论如何,我一直在努力维护存储库中的一组块,所以也许我会沿着这条路工作。
【解决方案3】:

我不确定使用块是否是解决问题的正确方法。

拥有一个实现 RKObjectLoaderDelegate 的类 GetProfile 怎么样。 因此,您从这里调用请求并将自己设置为委托。 然后每个请求都有一个 objectLoader。

所以在您的视图控制器中,每次您使用 GetProfile 时,您都会创建一个实例。然后当该实例向您的控制器发送消息时(通过委托?)您知道它是哪个。

我也在努力解决这个问题,所以很想听到反馈。

【讨论】:

  • 我对之前的建议做了类似的评论,但似乎对 objectlaoderdelegate 类的弱引用意味着当 restkit 调用返回并调用委托时,委托引用已经消失。 RestKit 不保留对委托的引用,这意味着我必须在我的仓库或其他类中保留对自定义委托的引用......可行但我认为非常庞大
【解决方案4】:

切换到 AFNetworking 似乎是要走的路……对于我需要的东西来说,它的实现要容易得多。

【讨论】:

  • 就我个人而言,我不认为有人问了关于 RestKit 的问题,人们尽力回答,最终正确的答案被标记为“切换到 AF Networking”。问 SO 问题的全部意义在于让社区帮助解决技术问题?
  • 但问题是是否可以使用积木,答案是否定的。在任何大型项目中都无法使用用户数据进行消歧,因此 AFNetworking 似乎是唯一的选择。
猜你喜欢
  • 2018-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-14
  • 2022-01-03
  • 1970-01-01
相关资源
最近更新 更多