gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 19:31:26 32 4
gpt4 key购买 nike

我有一个奇怪的错误,不知从哪里冒出来。我几乎完成了我的应用程序并正在测试它,然后我注意到数据没有更新。数据库得到更新,我可以直接点击 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))
}

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()

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

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

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

有人知道是什么原因造成的吗?


*编辑:

使用 Abhi Beckert 的回答,我尝试了这个:

符合委托(delegate)NSURLConnectionDelegate

添加:

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

然后调用电话:

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))
}

这个方法还是不行。

最佳答案

您需要将 Controller 对象设置为 NSURLConnection 的委托(delegate):

let request = NSURLRequest(URL: requestURL, cachePolicy: .ReloadIgnoringLocalCacheData, timeoutInterval: 60)
self.currentConnection = NSURLConnection(request: request, delegate: self)

这也需要让self符合数据源:

class MyController: NSURLConnectionDataDelegate {

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

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

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

不幸的是,这意味着您不能使用 sendAsynchronousRequest 便捷方法和 block 回调 - 相反,您必须使用 NSURLConnectionDataDelegate 中的委托(delegate)方法来处理响应。基本上你必须创建一个 NSMutableData 对象,并在数据从连接传入时附加到它,直到连接告诉你请求已完成或失败——然后你可以对数据做一些事情.

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

关于swift - 如何防止我的 HTTP Get 请求被缓存在 Swift 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28312119/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com