首页 > 解决方案 > 如何在 BOX Content SDK for iOS 中实现 BOXContentCacheClientProtocol

问题描述

我正在使用适用于 iOS 的 BOX Content SDK。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 的人会接受这个并提供一些指导。

标签: iossdkbox

解决方案


您在缓存客户端协议实现上是正确的。对于 performRequestWithCached,想法是您从缓存块中填充 UI 并刷新缓存,并且在刷新块最终返回来自 Box API 的最新数据之后的 UI。但是,如果您的用例是在进行网络调用之前首先检查缓存,请考虑在 cacheclient 协议上实现 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 ) 然后决定再次调用这次设置的刷新块以从网络中提取数据。


推荐阅读