ios - 如何在 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 的人会接受这个并提供一些指导。
解决方案
您在缓存客户端协议实现上是正确的。对于 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 ) 然后决定再次调用这次设置的刷新块以从网络中提取数据。
推荐阅读
- mysql - 如果 MySQL COUNT 不为空,则返回 0
- assembly - 如何将 AVR GCC 风格的 C 内联汇编翻译成 Rust 内联汇编?
- tcl - TCL - 将多个变量设置为 0
- excel - 访问网页中的主要 HTML 文档以使用 Selenium 自动化 Chrome
- python - 使用 Office365-REST-Client 从 OneDrive 的共享链接下载文件
- javascript - 使用 javascript 类中的方法返回未定义
- xamarin.ios - AVCaptureSession 捕获的照片大小与预览不同?
- symfony - Symfony 2.8 两个数据库连接
- python - 在numpy数组python中计算连续的
- winforms - 某些用户的 WinForm 缩放不正确