多个对象等待相同的API响应

时间:2015-08-20 23:00:34

标签: ios objective-c caching

我有一个API代码,它会加载我的应用程序所需的数据。 它很简单:

- (void) getDataForKey:(NSString*) key onSuccess:(id (^)())completionBlock

我缓存从服务器返回的数据,因此下一次调用该函数不应该执行网络请求,直到给定密钥丢失了一些数据,然后我需要从服务器端再次加载它。

只要每个屏幕有一个请求,一切都很好,但是现在我有一个案例,我需要在一个屏幕上为每个单元格执行此操作。 问题是我的缓存不起作用,因为在第一个响应进入之前,同时创建了5-6个缓存。

这里有什么解决办法可以不创建多个网络请求并让其他呼叫等待第一个?

2 个答案:

答案 0 :(得分:1)

您可以尝试创建一个RequestManager类。使用字典来缓存请求请求。

  1. 如果下一个请求与第一个请求的类型相同,请不要发出新请求但返回第一个请求。如果您选择此解决方案,则需要管理completionBlock列表,然后您就可以将结果发送给所有请求者。

  2. 如果下一个请求与第一个请求的类型相同,则在另一个线程中等待,直到完成第一个请求。然后发出新请求,您将自动读取缓存。您必须确保您的代码是线程安全的。

  3. 或者您可以使用操作队列来执行此操作。一些文件:

    Apple: Operation Queues

    Soheil Azarpour: How To Use NSOperations and NSOperationQueues

答案 1 :(得分:0)

可能会有这么多耗时的解决方案。我有一个技巧。在AppDelegate中创建BOOL,其默认值为FALSE。收到第一个回复后,将其设置为TRUE。因此,当您转到其他屏幕并在发出请求之前,只需在条件中检查BOOL变量的值。如果它的TRUE意味着收到了响应,那就去吧,否则不做任何事情。