如何防止我的 HTTP Get 请求在 Swift 中缓存?

Kol*_*lby 7 swift

我遇到了一个不知从何而来的奇怪错误。我的应用程序快完成了,我正在测试它,然后我注意到数据没有更新。数据库得到更新,我可以直接点击 URL 并看到数据正在从服务器正确返回,但是当我在 Swift 中打印数据时,它没有改变。

一旦我重新运行应用程序,它就会改变(大多数时候)

我正在使用 Alamofire,但我也尝试了其他两种方法:

let url = NSURL(string: "http://www.stackoverflow.com")
let request = NSURLRequest(URL: url!)

NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue()) {(response, data, error) in
    println(NSString(data: data, encoding: NSUTF8StringEncoding))
}
Run Code Online (Sandbox Code Playgroud)

let url = NSURL(string: "http://www.stackoverflow.com")
let task = NSURLSession.sharedSession().dataTaskWithURL(url!) {(data, response, error) in
    println(NSString(data: data, encoding: NSUTF8StringEncoding))
}

task.resume()
Run Code Online (Sandbox Code Playgroud)

所有 3 个都打印出相同的数据。

我猜测这是 Swift 中的缓存问题,但我没有设置任何内容来告诉 Swift 缓存数据,并且在过去几周内一直运行良好。

我今天所做的唯一一件事就是为我的项目创建一个 Git 存储库。

有谁知道这可能是什么原因造成的?


*编辑:

使用阿比·贝克特的回答我尝试了这个:

符合委托 NSURLConnectionDelegate

添加:

func connection(connection: NSURLConnection, willCacheResponse cachedResponse: NSCachedURLResponse) -> NSCachedURLResponse?
{
  return nil // never cache anything. ever.
}
Run Code Online (Sandbox Code Playgroud)

然后拨打电话:

let url:NSURL! = NSURL(string: "http://coffee.datausadev.com/api/getCoffeeBrands")
let request = NSURLRequest(URL: url, cachePolicy: .ReloadIgnoringLocalCacheData, timeoutInterval: 60)

NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue()) {(response, data, error) in
    println(NSString(data: data, encoding: NSUTF8StringEncoding))
}
Run Code Online (Sandbox Code Playgroud)

这个方法还是不行。

Abh*_*ert 2

您需要将控制器对象设置为以下对象的委托NSURLConnection

\n\n
let request = NSURLRequest(URL: requestURL, cachePolicy: .ReloadIgnoringLocalCacheData, timeoutInterval: 60)\nself.currentConnection = NSURLConnection(request: request, delegate: self)\n
Run Code Online (Sandbox Code Playgroud)\n\n

这还需要使 self 符合数据源:

\n\n
class MyController: NSURLConnectionDataDelegate {\n
Run Code Online (Sandbox Code Playgroud)\n\n

并使用相关委托方法禁用缓存:

\n\n
func connection(connection: NSURLConnection, willCacheResponse cachedResponse: NSCachedURLResponse) -> NSCachedURLResponse?\n{\n  return nil // never cache anything. ever.\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

URL 请求上的选项.ReloadIgnoringLocalCacheData将禁用读取缓存,并且willCacheResponse委托方法将禁用写入缓存。您需要同时使用它们。

\n\n

不幸的是,这意味着您无法使用sendAsynchronousRequest便捷方法并阻止回调 - 相反,您必须使用委托方法来NSURLConnectionDataDelegate处理响应。基本上,您必须创建一个NSMutableData对象,并在数据从连接传入时附加到该对象,直到连接告诉您请求已完成或失败 \xe2\x80\x94\xc2\xa0 然后您可以对数据执行某些操作。

\n\n

据我所知,在使用时完全禁用缓存是不可能的sendAsynchronousRequest。您可能想要创建一个包装类NSURLConnection以使您的代码更加整洁。

\n