iOS Swift - URLSessionDataTask 在刷新时未更新 JSON 数据
iOS Swift - URLSessionDataTask doesn't get updated JSON data on refresh
我有一个简单的应用程序,我以这种方式从存储在我自己的服务器中的 JSON 文件中获取数据 - 我正在使用 SwiftyJSON:
func queryData(_ fileName:String) {
guard let url = URL(string: JSON_PATH + fileName + ".json") else {return} // JSON_PATH + fileName + ".json" is the complete path to my db.json file (see below)
let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
guard let dataResponse = data, error == nil else {
self.simpleAlert(error!.localizedDescription)
return
}
let jsonData = try! JSON(data: dataResponse)
print("ARRAY: \(jsonData)")
}
task.resume()
}
这是我的 db.json
文件:
[
{
"objID":"GNoW3vszYz",
"string":"First (1) string",
"pointer":["pointer","yN76TF43i8"],
"boolean":true,
"number":123,
"fileURL":"https://example.com/uploads/01.jpg",
"array":["aaa","bbb","ccc"]
},
{
"objID":"yN76TF43lD",
"string":"Second (2) string",
"pointer":["pointer","GNoN3vsz2I"],
"boolean":false,
"number":12.55,
"fileURL":"https://example.com/uploads/02.jpg",
"array":["aaa","eee","fff"]
}
]
问题是,如果我手动编辑我的 db.json
文件,假设我将 "number":123,
更改为 "number":5555,
保存并再次上传到我的服务器并 运行又是我的应用程序,控制台日志显示了与上面相同的 JSON 数据,就像我什么都没做一样。
我已经尝试终止该应用程序并 运行 它再次使用 Xcode 2-3 次,没有成功,这是我获得更新的唯一方法 JSON文件数据是删除应用程序并通过Xcode重新安装。
有没有办法始终通过 URLSessionDataTask
获取更新的 JSON 数据?
谢谢。
我可以想到两种方法。
1) 在 url
的末尾添加当前日期时间
2) 禁用本地缓存。
对于 1)
extension Date {
func currentTimeMillis() -> Int64 {
return Int64(self.timeIntervalSince1970 * 1000)
}
}
let url = URL(string: JSON_PATH + fileName + ".json?q=\(Date().currentTimeMillis())")
对于 2)
let config = URLSessionConfiguration.default
config.requestCachePolicy = .reloadIgnoringLocalCacheData
config.urlCache = nil
let session = URLSession.init(configuration: config)
取自此SO
这是由于 URLSession
缓存了来自服务器的数据,这通常在来自服务器的 json 文件的 header 中发送。
如果您无法在服务器端进行任何更改,那么您可以使用 .ephemeral
which apple documents here
使用此代码
let configuration = URLSessionConfiguration.ephemeral
let session = URLSession(configuration: configuration)
.ephemeral
用于只存储在内存中的数据,不会存储在磁盘上
存储在网络服务器上的文本文件(和其他非 JSON 文件)以及使用 URLSession 从该文本文件中获取数据时也会发生此行为。 .ephemeral 在这种情况下也适用。
if let url = URL(string: "http://www.somerandomsite.com/mydata.txt") {
let configuration = URLSessionConfiguration.ephemeral
var urlSession = URLSession(configuration: configuration).dataTask(with: url) {(data, response, error) in
if let error = error {
print(error)
}
if var textFile = String(data: data!, encoding: .utf8){
print(textFile)
}
}
urlSession.resume()
我有一个简单的应用程序,我以这种方式从存储在我自己的服务器中的 JSON 文件中获取数据 - 我正在使用 SwiftyJSON:
func queryData(_ fileName:String) {
guard let url = URL(string: JSON_PATH + fileName + ".json") else {return} // JSON_PATH + fileName + ".json" is the complete path to my db.json file (see below)
let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
guard let dataResponse = data, error == nil else {
self.simpleAlert(error!.localizedDescription)
return
}
let jsonData = try! JSON(data: dataResponse)
print("ARRAY: \(jsonData)")
}
task.resume()
}
这是我的 db.json
文件:
[
{
"objID":"GNoW3vszYz",
"string":"First (1) string",
"pointer":["pointer","yN76TF43i8"],
"boolean":true,
"number":123,
"fileURL":"https://example.com/uploads/01.jpg",
"array":["aaa","bbb","ccc"]
},
{
"objID":"yN76TF43lD",
"string":"Second (2) string",
"pointer":["pointer","GNoN3vsz2I"],
"boolean":false,
"number":12.55,
"fileURL":"https://example.com/uploads/02.jpg",
"array":["aaa","eee","fff"]
}
]
问题是,如果我手动编辑我的 db.json
文件,假设我将 "number":123,
更改为 "number":5555,
保存并再次上传到我的服务器并 运行又是我的应用程序,控制台日志显示了与上面相同的 JSON 数据,就像我什么都没做一样。
我已经尝试终止该应用程序并 运行 它再次使用 Xcode 2-3 次,没有成功,这是我获得更新的唯一方法 JSON文件数据是删除应用程序并通过Xcode重新安装。
有没有办法始终通过 URLSessionDataTask
获取更新的 JSON 数据?
谢谢。
我可以想到两种方法。
1) 在 url
的末尾添加当前日期时间2) 禁用本地缓存。
对于 1)
extension Date {
func currentTimeMillis() -> Int64 {
return Int64(self.timeIntervalSince1970 * 1000)
}
}
let url = URL(string: JSON_PATH + fileName + ".json?q=\(Date().currentTimeMillis())")
对于 2)
let config = URLSessionConfiguration.default
config.requestCachePolicy = .reloadIgnoringLocalCacheData
config.urlCache = nil
let session = URLSession.init(configuration: config)
取自此SO
这是由于 URLSession
缓存了来自服务器的数据,这通常在来自服务器的 json 文件的 header 中发送。
如果您无法在服务器端进行任何更改,那么您可以使用 .ephemeral
which apple documents here
使用此代码
let configuration = URLSessionConfiguration.ephemeral
let session = URLSession(configuration: configuration)
.ephemeral
用于只存储在内存中的数据,不会存储在磁盘上
存储在网络服务器上的文本文件(和其他非 JSON 文件)以及使用 URLSession 从该文本文件中获取数据时也会发生此行为。 .ephemeral 在这种情况下也适用。
if let url = URL(string: "http://www.somerandomsite.com/mydata.txt") {
let configuration = URLSessionConfiguration.ephemeral
var urlSession = URLSession(configuration: configuration).dataTask(with: url) {(data, response, error) in
if let error = error {
print(error)
}
if var textFile = String(data: data!, encoding: .utf8){
print(textFile)
}
}
urlSession.resume()