如何加载JSON表视图并保存数据,即使在关闭时也是如此



我目前有一个按钮,可以打开TableViewController并使用JSON加载数据,如下所示:

private func JSON() {
print(facility)
guard let url = URL(string: "https://example/example/example"),
let sample = value1.addingPercentEncoding(withAllowedCharacters: .urlQueryValueAllowed)
else { return }
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.httpBody = "example1=(example)".data(using: .utf8)
URLSession.shared.dataTask(with: request) { data, _, error in
guard let data = data else { return }
do {
self.JStruct = try JSONDecoder().decode([exampleStruct].self,from:data)
DispatchQueue.main.async {
self.tableView.reloadData()
}
}
catch {
print(error)
}
}.resume()
}

然后,在我看完表格视图后,我通过以下操作关闭它:

self.dismiss(animated: true, completion: nil)

使用BarButtonItem。

问题是每次打开UIView时都需要一些时间来加载数据。有没有办法只加载一次tableView,当它被驳回并重新打开时,只显示之前已经加载的相同数据?

您能做的最好的事情就是在本地存储数据。使用本地数据库或纯文本文件来存储数据。打开页面时,请检查数据是否已存在。如果它已经存在,则加载它,并在后台静默地调用API以更新现有数据。如果未保存数据,请调用API,加载数据并在本地保存。

func getFileURL() -> URL {
let fileName = "CacheData"
let documentDirURL = try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
let fileURL = documentDirURL.appendingPathComponent(fileName).appendingPathExtension("json")
return fileURL
}
func createFile(data: Data) {
let fileURL = getFileURL()
do {
try data.write(to: fileURL)
} catch let e {
print(e.localizedDescription)
}
}
func loadData() -> Data? {
let fileURL = getFileURL()
do {
let data = try Data(contentsOf: fileURL)
return data
} catch let e {
print(e.localizedDescription)
}
return nil
}

在您的viewDidLoad方法中执行以下操作:

let fileURL = getFileURL()
if FileManager.default.fileExists(atPath: fileURL.path) {
if let data = loadData() {
do {
self.JStruct = try 
JSONDecoder().decode([exampleStruct].self,from:data)
DispatchQueue.main.async {
self.tableView.reloadData()
} catch {
print(error)
}
}
}
JSON()

并在从API获取数据时调用createFile。您可能需要编写文件并使用后台队列加载文件,以避免主线程过载和冻结。

最新更新