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

标签 json swift local getjson

每次打开应用程序时,我都能从服务器下载一个 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/

相关文章:

javascript - 页面重新加载后从本地存储中检索复选框集合的保存状态

java - 将带有嵌套字符的字符串转换为java中特定的json格式

objective-c - 如何在 swift 中使用 IOPMAssertionCreateWithName

mysql - #2002 - 服务器没有响应(或者本地 MySQL 服务器的套接字配置不正确)

ios - 使用 numberformatter 将字符串快速转换为 double 返回 nil

ios - BRAOfficeDocumentPackage 未声明的类型

python - 如何解决在本地运行我的 python 代码的问题?

javascript - 如何在 jQuery 中解析这个无效的 JSON 字符串?

Python JSON 纽约时报 API

javascript - 从第三方API获取固定数量的JSON对象