- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个奇怪的错误,不知从哪里冒出来。我几乎完成了我的应用程序并正在测试它,然后我注意到数据没有更新。数据库得到更新,我可以直接点击 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/
我是一名优秀的程序员,十分优秀!