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

how to implement BOXContentCacheClientProtocol in BOX Content SDK for iOS

我正在使用 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 查找它们。如果之前已请求文件夹并在缓存中产生结果,则只需 return 缓存结果。像这样:

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

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

我错过了什么吗?如果调用 cacheBlock,performRequestWithCached 的调用者是否应该取消请求?希望 BOX 的人能够接受并提供一些指导。

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

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