尝试使用 Alamofire 缓存但没有结果

Posted

技术标签:

【中文标题】尝试使用 Alamofire 缓存但没有结果【英文标题】:Trying to cache with Alamofire with no results 【发布时间】:2016-09-29 21:47:52 【问题描述】:

我正在尝试使用 Alamofire 缓存,所以我想要的行为是第一次从 Web 加载,下一次如果缓存中存在数据,则返回它而不发出更多请求……在我考虑过期之后...

我的代码总是返回无响应...对此有什么建议吗?谢谢

    let config = NSURLSessionConfiguration.defaultSessionConfiguration()
    config.URLCache = NSURLCache.sharedURLCache()
    config.requestCachePolicy = NSURLRequestCachePolicy.ReturnCacheDataElseLoad
    let manager = Alamofire.Manager(configuration: config)
    manager.request(.GET, url, parameters: parameters, encoding: .URL, headers: ["Token":LocalStorage.read("token") as! String, "Version":"2"]).responseJSON  (response) in

        if let json = response.result.value
        
            if response.response?.statusCode == 200
            
                completionHandler(parser.parseSwifty(JSON(json)), nil)
            
            else
            
                completionHandler(nil, serverErrorMessage)
            
        
        else
        
            completionHandler(nil, networkErrorMessage)
        

    

【问题讨论】:

【参考方案1】:

所以...我解决了这个问题: 在我的 NetworkHelper 中,我添加了一个计算属性,如下所示:

    static let manager: Manager = 
    let memoryCapacity = 100 * 1024 * 1024; // 100 MB
    let diskCapacity = 100 * 1024 * 1024; // 100 MB
    let cache = NSURLCache(memoryCapacity: memoryCapacity, diskCapacity: diskCapacity, diskPath: "shared_cache")

    let configuration: NSURLSessionConfiguration = NSURLSessionConfiguration.defaultSessionConfiguration()
    configuration.HTTPAdditionalHeaders = ["Token":LocalStorage.read("token") as! String, "Version":"2"]
    configuration.requestCachePolicy = .ReturnCacheDataElseLoad // this is the default
    configuration.URLCache = cache

    return Manager(configuration: configuration)
()

当我必须检索一些数据时:

        self.manager.request(.GET, url, parameters: parameters, encoding: .URL)
        .response  (request, response, data, error) in
            debugPrint(request)
            debugPrint(response)
            debugPrint(error)
    .responseJSON......

我还写了一个函数来预加载一些数据,如下所示:

    static func preloadGetRequest(url : String, parameters: Dictionary<String, String>?)

    self.manager.request(.GET, url, parameters: parameters, encoding: .URL)
        .response  (request, response, data, error) in
            debugPrint(request)
            debugPrint(response)
            debugPrint(error)
    

试着告诉我:)

【讨论】:

【参考方案2】:

似乎正确的方法是在调用请求之前尽早创建会话管理器,否则请求将始终返回 nil。

var sessionManager: SessionManager!
override func viewDidLoad() 
    let configuration = URLSessionConfiguration.default
    configuration.requestCachePolicy = .returnCacheDataElseLoad
    sessionManager = SessionManager(configuration: configuration)


//later on
@objc private func refreshWeatherData(_ sender: Any) 
    // Fetch Weather Data
    sessionManager.request("https://jsonplaceholder.typicode.com/posts")
    .response  (data) in
        self.refreshControl?.endRefreshing()
        if let data = data.data 
            let json = try? JSON(data: data)
        
    

或者创建一个带有缓存策略的 URLRequest,像这样

@objc private func refreshWeatherData(_ sender: Any) 
    // Fetch Weather Data
    let request = URLRequest(url: URL(string: "https://jsonplaceholder.typicode.com/posts")!, cachePolicy: .returnCacheDataElseLoad, timeoutInterval: 100)        
    Alamofire.request(request)
    .response  (data) in
        self.refreshControl?.endRefreshing()
        if let data = data.data 
            let json = try? JSON(data: data)
        
    

【讨论】:

以上是关于尝试使用 Alamofire 缓存但没有结果的主要内容,如果未能解决你的问题,请参考以下文章

为我可以用来操作 JSON 的 Alamofire 创建回调

Swift 中的 Alamofire .post。 “调用结果未使用,但产生‘DataRequest’

从后台获取调用时,Alamofire 不工作

无法在 Alamofire 中禁用缓存(Xcode 9 - swift 4)

如何覆盖 Alamofire SessionManager 以修改响应以添加标头?

似乎无法使用 Alamofire 获取缓存的响应