如何在适用于iOS的BOX Content SDK中实现BOXContentCacheClientProtocol

时间:2018-10-19 14:32:53

标签: ios sdk box

我正在使用BOX Content SDK for iOS。 BOX通常建议对API结果进行某种形式的缓存,以降低达到API节流限制的风险。我在SDK中看到有一个名为BOXContentCacheClientProtocol的协议,许多API请求的方法似乎使用了缓存的结果。例如,获取文件夹信息的请求之一:

- (void)performRequestWithCached:(BOXFolderBlock)cacheBlock
                       refreshed:(BOXFolderBlock)refreshBlock
{
  if (cacheBlock) {
    if ([self.cacheClient respondsToSelector:@selector(retrieveCacheForFolderRequest:completion:)]) {
      [self.cacheClient retrieveCacheForFolderRequest:self completion:cacheBlock];
    } else {
      cacheBlock(nil, nil);
    }
  }
  [self performRequestWithCompletion:refreshBlock];
}

在我看来,在缓存客户端中实现retrieveCacheForFolderRequest的正确方法是将每个文件夹的请求结果存储在缓存中,并通过某种唯一的ID查找它们。如果先前已请求文件夹并且在缓存中有结果,则只需返回缓存的结果。像这样:

- (void)retrieveCacheForFolderRequest:(BOXFolderRequest *)request 
                           completion:(BOXFolderBlock)completionBlock
{
  BOXFolder *cachedResult = [_cache objectForKey:request.folderID];
  if (cachedResult) {
    completionBlock(cachedResult, nil);
  }
}

但是,查看performRequestWithCached的源代码,成功找到缓存的结果并不会阻止请求实现仍调用API从服务器获取相同的结果。

我想念什么吗?如果调用cacheBlock,performRequestWithCached的调用者是否应该取消请求?希望来自BOX的人能够对此有所帮助并提供一些指导。

1 个答案:

答案 0 :(得分:0)

您正确使用了缓存客户端协议。对于performRequestWithCached,想法是您从缓存块填充UI并刷新缓存,并且刷新块最终从Box API返回最新数据后,UI。但是,如果您的用例是在进行网络调用之前先检查缓存,请考虑在cacheclient协议(https://github.com/box/box-ios-sdk/blob/master/BoxContentSDK/BoxContentSDK/Protocols/BOXContentCacheClientProtocol.h#L172)上实现cacheFolderRequest

或者,您仍然可以执行performRequestWithCached并将刷新块设置为nil(这样跳过网络调用,就像https://github.com/box/box-ios-sdk/blob/master/BoxContentSDK/BoxContentSDK/Requests/BOXFolderRequest.m#L132一样),然后决定这次使用刷新块设置进行另一个调用以从网络中提取数据。