脱机时从FileManager检索保存的信息



在我的ViewController中,我有以下内容。通过使用断点&打印语句我可以看到我正确地保存了数据。当用户失去互联网连接时,如何使用此处的getItemsFromDisk函数调用保存的数据?在尝试if let url行之前,我尝试调用if/else语句从函数加载此数据,这导致根本没有接收到任何数据。

override func viewDidLoad() {
super.viewDidLoad()
let urlString = "https://fakeapitesturl.com"
DispatchQueue.global(qos: .userInitiated).async {
[weak self] in
if let url = URL(string: urlString) {
if let data = try? Data(contentsOf: url) {
self?.parse(json: data)
}
}
}
}
func parse(json: Data) {
let decoder = JSONDecoder()
if let jsonItems = try? decoder.decode(Items.self, from: json) {
items = jsonItems.data
saveItemsToDisk(items: items)
DispatchQueue.main.async { [weak self] in
self?.tableView.reloadData()
}
}
}
struct Items: Codable {
let data: [Item]
}

我有以下功能来保存/加载数据:

import Foundation
func getDocumentsURL() -> URL {
if let url = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first {
return url
} else {
fatalError("Could not retrieve documents directory")
}
}
func saveItemsToDisk(items: [Item]) {
let url = getDocumentsURL().appendingPathComponent("items.json")
let encoder = JSONEncoder()
do {
let data = try encoder.encode(items)
try data.write(to: url, options: [])
} catch {
fatalError(error.localizedDescription)
}
}
func getItemsFromDisk() -> [Item] {
let url = getDocumentsURL().appendingPathComponent("items.json")
let decoder = JSONDecoder()
do {
let data = try Data(contentsOf: url, options: [])
let items = try decoder.decode([Item].self, from: data)
return items
} catch {
fatalError(error.localizedDescription)
}
}

TIA寻求帮助

你试过这个吗?

if let data = try? Data(contentsOf: url) {
self?.parse(json: data)
} else {
items = getItemsFromDisk() 
DispatchQueue.main.async { [weak self] in
self?.tableView.reloadData()
}
}

最新更新