2017-01-16 67 views
1

我可以从服务器下载json文件,并在每次打开应用程序时将其放入TableView中。 (请参阅下面的代码)如何从远程保存程序下载json文件并保存为离线访问包

但是,我还希望允许使用上次下载的文件进行脱机访问。所以基本上我无法解决如何保存下载的文件进行本地访问离线。任何帮助(尤其是例子)非常感谢。

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 
    }) 
} 

}

+0

我不知道在这里你的问题...但你可以阅读更多关于__ [iOS上的数据存储](https://developer.apple.com/icloud/documentation/data-storage/index.html)__。 – holex

回答

1

你可以尝试保存您的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 
} 
+0

嗨拉蒙。感谢您花时间发布。我不确定我将如何调用函数或从何处调用它们?你能照亮我吗?最好的祝愿 – PhilipS

+0

当你从url获得你的json并在viewDidLoad上调用readData来查看你是否有磁盘上的数据或者你是否必须从网上下载它时,你可以在你的任务完成处理程序中调用saveData。 –

+0

@RamonVasconceolos 对不起,我很厚。能给我看看么? – PhilipS