我正在使用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的人能够对此有所帮助并提供一些指导。
答案 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一样),然后决定这次使用刷新块设置进行另一个调用以从网络中提取数据。