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

如何从远程保护程序下载json文件并保存到bundle以供脱机访问,json,swift,local,getjson,Json,Swift,Local,Getjson,我能够从服务器下载json文件,并在每次打开应用程序时将其放入TableView。(见下面的代码) 但是,我还希望允许使用上次下载的文件进行脱机访问。因此,基本上我很难解决如何保存下载的文件以供脱机本地访问。非常感谢任何帮助(特别是示例) class KalkanTableController: UITableViewController { var TableData:Array< String > = Array < String >() override f

我能够从服务器下载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
    })
}
类KalkanTableController:UITableViewController{ var TableData:Array=Array() 重写func viewDidLoad(){ super.viewDidLoad() 从url获取数据“http://ftp.MY 文件位置/kalkanInfoTest.json”) 如果let path=Bundle.main.path(forResource:“kalkanInfoTest”,类型为:“json”){ 做{ 让jsonData=try NSData(contentsOfFile:path,options:NSData.ReadingOptions.mappedIfSafe) 做{ 让jsonResult:NSDictionary=try JSONSerialization.jsonObject(使用:jsonData作为数据,选项:JSONSerialization.ReadingOptions.mutableContainers)作为!NSDictionary }捕获{} }捕获{} } } 重写func numberOfSections(在tableView:UITableView中)->Int{ 返回1 } 重写func tableView(tableView:UITableView,numberofrowsinssection:Int)->Int{ return TableData.count } 重写func tableView(tableView:UITableView,cellForRowAt indexath:indexPath)->UITableViewCell{ let cell=tableView.dequeueReusableCell(带有标识符:“cell”,用于:indexath) cell.textlab?.text=TableData[indexPath.row] 返回单元 } func从url获取数据(链接:字符串) { 让url:url=url(字符串:链接)! 让session=URLSession.shared let request=NSMutableURLRequest(url:url) request.httpMethod=“GET” request.cachePolicy=URLRequest.cachePolicy.reloadIgnoringCacheData 让task=session.dataTask(其中:request作为URLRequest,completionHandler:{ ( 数据、响应、错误) 保护let:Data=Data,let:URLResponse=response,error==nil-else{ 返回 } self.extract_json(数据!) }) task.resume() } func extract_json(data:data) { 有吗? 做 { json=尝试JSONSerialization.jsonObject(使用:data,选项:[]) } 抓住 { 返回 } guard let data_list=json作为?NSArray else { 返回 } 如果让item_list=json作为?NSArray { 对于0中的i..
}

您可以尝试使用这些方法在本地保存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
}

嗨,雷蒙。感谢您抽出时间发布。我不确定我将如何调用这些函数,或者从何处调用它们?你能为我照明吗?最好在从url获取json后,您可以在任务完成处理程序中调用saveData,并在viewDidLoad上调用readData,查看磁盘上是否有数据,或者是否必须从web下载。@Ramonvasconolos抱歉,我很忙。你能给我看看吗?@rRamon Vasconcelos谢谢雷蒙。今天剩下的时间我都很忙,但明天早上我将再次尝试实施:-)我不确定你这里的问题。。。但是你可以阅读更多关于。