gpt4 book ai didi

ios - 在本地存储 JSON 数据并在 tableView 中呈现时出现问题

转载 作者:行者123 更新时间:2023-11-29 05:21:35 25 4
gpt4 key购买 nike

我有以下函数将 JSON 数据加载到 TableView 中。虽然这是一个很好的解决方案,但我希望通过将 JSON 下载到存在时引用的本地文本文件来降低加载表数据所需的速度。

这就是 JSON() 函数的样子,其目的是从 API 中提取数据:

private func JSON() {
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()
self.createFile(data: Data)
}
}
catch {

print(error)
}

}.resume()
}

我还尝试使用以下 3 个函数 createFile()、getFileURL() 和 loadData() 来存储、调用 JSON 数据并将其呈现到 tableView 中。

这是我目前的 3 个功能:

func createFile(data: Data) {
let fileURL = getFileURL()
do {
try data.write(to: fileURL)
} catch let e {
print(e.localizedDescription)
}
}

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 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) {
guard let data = loadData() else { return }
do{
self.JStruct = try
JSONDecoder().decode([exampleStruct].self,from:data)
DispatchQueue.main.async {
self.tableView.reloadData()
}
}

catch {

print(error)

}

}

问题是在创建文件时它是空的。我无法理解 createFile() 的问题是什么?

最佳答案

如果我理解正确的话,如果可以的话,您希望从文件中获取 JSON,否则从网络中获取它。

为此,您需要至少从网络获取一次并将 JSON 保存在本地文件中。

像这样:

func fetchJSON(completionHandler: @escaping (Result<[ExampleStruct]>, Error>) -> Void) {
if let examples = loadExamplesFromFile() {
completionHandler(.success(examples))
} else {
loadExamplesFromNetwork() { result in
switch result {
case .success(let examples):
completionHandler(.success(examples))
case .failure(let error):
completionHandler(.failure(error))
}
}
}
}

func loadExamplesFromFile() -> [ExampleStruct]? {
guard let data = loadData() else {
return nil
}
do {
let examples = try JSONDecoder().decode([ExampleStruct].self,from:data)
return examples
}
catch let e {
print(e.localizedDescription)
}
return nil
}


func loadExamplesFromNetwork(completionHandler: @escaping (Result<[ExampleStruct]>, Error>) -> Void) {
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
if let err = error {
completionHandler(.failure(err)
} else {
guard let data = data else {
//TODO: Should call completionhandler with an appropriate error
return
}
do {
let examples = try JSONDecoder().decode([ExampleStruct].self,from:data)
completionHandler(.success(examples)
createFile(data: data)
}
}
catch {
completionHandler(.failure(error)
}

}.resume()
}

然后在您的viewDidLoad中您可以调用它:

fetchJSON { result in 
switch result {
case .success(let examples):
DispatchQueue.main.async {
self.JStruct = examples
self.tableView.reloadData()
}
case .failure(let error):
print(error.localizedDescription)
}
}

关于ios - 在本地存储 JSON 数据并在 tableView 中呈现时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58636289/

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