【问题标题】:Trying to cache with Alamofire with no results尝试使用 Alamofire 缓存但没有结果
【发布时间】: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)
        }

    }

【问题讨论】:

    标签: swift caching alamofire


    【解决方案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)
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2023-01-12
        • 2020-09-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多