gpt4 book ai didi

json - 如何从远程保护程序下载 json 文件并保存到 bundle 以供离线访问

转载 作者:行者123 更新时间:2023-11-28 06:26:38 25 4
gpt4 key购买 nike

每次打开应用程序时,我都能从服务器下载一个 json 文件并将其放入 TableView。 (见下面的代码)

但是,我还想允许使用上次下载的文件进行离线访问。所以基本上我无法弄清楚如何保存下载的文件以供离线本地访问。非常感谢任何帮助(尤其是示例)。

 class KalkanTableController: UITableViewController {

var TableData:Array< String > = Array < String >()


override func viewDidLoad() {
super.viewDidLoad()


get_data_from_url("http://ftp.MY FILE LOCATION/kalkanInfoTest.json")
if let path = Bundle.main.path(forResource: "kalkanInfoTest", ofType: "json") {
do {
let jsonData = try NSData(contentsOfFile: path, options: NSData.ReadingOptions.mappedIfSafe)
do {
let jsonResult: NSDictionary = try JSONSerialization.jsonObject(with: jsonData as Data, options: JSONSerialization.ReadingOptions.mutableContainers) as! NSDictionary
} catch {}
} catch {}
}
}


override func numberOfSections(in tableView: UITableView) -> Int {
return 1
}

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return TableData.count
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)

cell.textLabel?.text = TableData[indexPath.row]
return cell
}

func get_data_from_url(_ link:String)
{
let url:URL = URL(string: link)!
let session = URLSession.shared

let request = NSMutableURLRequest(url: url)
request.httpMethod = "GET"
request.cachePolicy = URLRequest.CachePolicy.reloadIgnoringCacheData


let task = session.dataTask(with: request as URLRequest, completionHandler: {
(
data, response, error) in

guard let _:Data = data, let _:URLResponse = response , error == nil else {

return
}
self.extract_json(data!)
})
task.resume()
}


func extract_json(_ data: Data)
{
let json: Any?
do
{
json = try JSONSerialization.jsonObject(with: data, options: [])
}
catch
{
return
}

guard let data_list = json as? NSArray else
{
return
}

if let item_list = json as? NSArray
{
for i in 0 ..< data_list.count
{
if let item_obj = item_list[i] as? NSDictionary
{
if let item_name = item_obj["kalkanInfo"] as? Stri
{
TableData.append(item_name)

print(item_name)
}
}
}
}
DispatchQueue.main.async(execute: {self.do_table_refresh()})
}

func do_table_refresh()
{
DispatchQueue.main.async(execute: {
self.tableView.reloadData()
return
})
}

最佳答案

您可以尝试使用这些方法将您的 json 保存在本地以保存在磁盘上

override func viewDidLoad() {
super.viewDidLoad()

if readKalkanDataFromDisk() {
extract_json(readKalkanDataFromDisk())
} else {
get_data_from_url("http://ftp.MY FILE LOCATION/kalkanInfoTest.json")
}
}

func get_data_from_url(_ link:String)
{
let url:URL = URL(string: link)!
let session = URLSession.shared

let request = NSMutableURLRequest(url: url)
request.httpMethod = "GET"
request.cachePolicy = URLRequest.CachePolicy.reloadIgnoringCacheData


let task = session.dataTask(with: request as URLRequest, completionHandler: {
(
data, response, error) in

guard let _:Data = data, let _:URLResponse = response , error == nil else {

return
}
saveKalkanDataOnDisk(kalkanData: data!)
self.extract_json(data!)
})
task.resume()
}

func saveKalkanDataOnDisk(kalkanData: Data) {
do {
let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
let fileURL = documentsURL.appendingPathComponent("Kalkan.json")
try kalkanData.write(to: fileURL, options: .atomic)
} catch { }
}

func readKalkanDataFromDisk() -> Data? {
let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
let filePath = documentsURL.appendingPathComponent("Kalkan.json").path
if FileManager.default.fileExists(atPath: filePath), let data = FileManager.default.contents(atPath: filePath) {
return data
}
return nil
}

关于json - 如何从远程保护程序下载 json 文件并保存到 bundle 以供离线访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41672065/

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