我遇到了一个不知从何而来的奇怪错误。我的应用程序快完成了,我正在测试它,然后我注意到数据没有更新。数据库得到更新,我可以直接点击 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)
这个方法还是不行。
您需要将控制器对象设置为以下对象的委托NSURLConnection:
let request = NSURLRequest(URL: requestURL, cachePolicy: .ReloadIgnoringLocalCacheData, timeoutInterval: 60)\nself.currentConnection = NSURLConnection(request: request, delegate: self)\nRun Code Online (Sandbox Code Playgroud)\n\n这还需要使 self 符合数据源:
\n\nclass MyController: NSURLConnectionDataDelegate {\nRun Code Online (Sandbox Code Playgroud)\n\n并使用相关委托方法禁用缓存:
\n\nfunc connection(connection: NSURLConnection, willCacheResponse cachedResponse: NSCachedURLResponse) -> NSCachedURLResponse?\n{\n return nil // never cache anything. ever.\n}\nRun Code Online (Sandbox Code Playgroud)\n\nURL 请求上的选项.ReloadIgnoringLocalCacheData将禁用读取缓存,并且willCacheResponse委托方法将禁用写入缓存。您需要同时使用它们。
不幸的是,这意味着您无法使用sendAsynchronousRequest便捷方法并阻止回调 - 相反,您必须使用委托方法来NSURLConnectionDataDelegate处理响应。基本上,您必须创建一个NSMutableData对象,并在数据从连接传入时附加到该对象,直到连接告诉您请求已完成或失败 \xe2\x80\x94\xc2\xa0 然后您可以对数据执行某些操作。
据我所知,在使用时完全禁用缓存是不可能的sendAsynchronousRequest。您可能想要创建一个包装类NSURLConnection以使您的代码更加整洁。
| 归档时间: |
|
| 查看次数: |
7299 次 |
| 最近记录: |