• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ios - NSURLCache Alamofire 删除缓存的响应

[复制链接]
菜鸟教程小白 发表于 2022-12-11 17:09:32 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我正在使用以下代码来测试 NSURLCache 中的行为。我在 AppDelegate 中初始化了一个 API 实例。我根据 Alamofire 的文档配置管理器,配置共享缓存,并分配 dataTaskWillCacheResponse 以确保响应确实会被缓存。

然后我调用 makeRequest 来检查缓存的响应是否存在(它不应该在第一次启动时),然后我使用我的 manager 发出请求相同的 URL,以便请求在整个测试过程中是等效的。

我在 dataTaskWillCacheResponse 的断点被命中,我继续,responseJSON block 被执行并且是 Successful 所以我 performTests 使用请求。

  1. 首先,我检查响应是否被缓存。 很好!
  2. 第二,(这就是问题所在)我删除了该请求的缓存响应,然后检查它是否存在。 确实如此:糟糕!
  3. 第三,我检查删除 all 缓存的响应是否会删除该响应。 确实:好! 但奇怪的是,这行得通,而之前尝试仅删除单个响应并没有...

代码如下:

import Alamofire

class API: Manager.SessionDelegate {
    
    var manager: Manager!

    override init() {
        super.init()
        manager = Manager(session: urlSession(), delegate: self)
        configureCache(memoryCapacityMB: 5, diskCapacityMB: 25)
        manager.delegate.dataTaskWillCacheResponse = { urlSession, dataTask, cachedResponse in
            // Placing a breakpoint here confirms that the response is going to be cached
            return cachedResponse
        }
    }
    
    private func urlSession() -> NSURLSession {
        let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
        return NSURLSession(configuration: configuration, delegate: self, delegateQueue: nil)
    }
    
    private func configureCache(memoryCapacityMB memory: Int, diskCapacityMB disk: Int) {
        let memoryCapacity = memory * 1024 * 1024
        let diskCapacity = disk * 1024 * 1024
        let sharedCache = NSURLCache(memoryCapacity: memoryCapacity, diskCapacity: diskCapacity, diskPath: nil)
        NSURLCache.setSharedURLCache(sharedCache)
    }
    
    // MARK: Request
    
    func makeRequest() {
        // The response should be nil on the first launch since nothing has been cached
        let request = NSURLRequest(URL: NSURL(string: "http://jsonplaceholder.typicode.com/posts")!)
        let response = NSURLCache.sharedURLCache().cachedResponseForRequest(request)
        print(response)
        
        manager.request(.GET, request.URLString).responseJSON { response in
            switch response.result {
            case .Success:
                self.performTests(with: response.request!)
    
            case .Failure:
                break
                
            }
        }
    }
    
    func performTests(with request: NSURLRequest) {
        // Should exist
        var response = NSURLCache.sharedURLCache().cachedResponseForRequest(request)
        print(response)
        // And it does: good!
        
        // Remove the cached resopnse and check if it exists
        NSURLCache.sharedURLCache().removeCachedResponseForRequest(request)
        response = NSURLCache.sharedURLCache().cachedResponseForRequest(request)
        print(response)
        // And it does: bad!
        
        // Try removing all cached responses and check if it exists
        NSURLCache.sharedURLCache().removeAllCachedResponses()
        response = NSURLCache.sharedURLCache().cachedResponseForRequest(request)
        print(response)
        // And it doesn't: good! But odd...
    }
    
}

那么如何删除单个请求的缓存响应呢?这是意外行为吗?还是 NSURLCache 行为正确而我只是遗漏了一些东西?提前感谢您查看!



Best Answer-推荐答案


我记得大多数 URL 缓存更改不是同步的。它们仅在您返回运行循环并允许发生各种异步回调后才会真正发生。

尝试在延迟 3-5 秒后异步运行其余代码,看看请求是否已被删除。

如果这不能解决问题,请提交错误。

关于ios - NSURLCache Alamofire 删除缓存的响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38729214/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap