2017-01-16 12 views
1

jsonファイルをサーバーからダウンロードし、AppViewを開くたびに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

を節約するためにこれらのメソッドを使用してローカルであなたのJSONを保存しようとすることができますabout __ [iOS上のデータ保存](https://developer.apple.com/icloud/documentation/data-storage/index.html)__。 – holex

答えて

1

あなたは、私はここにあなたの問題についてはよく分からない...しかし、あなたはより多くを読むことができ、ディスク

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

こんにちはRamon。投稿していただきありがとうございます。私は関数をどのように呼び出すか、どこから呼び出すのか正確にはわかりません。あなたは私を照らしてくれますか?最高の願い – PhilipS

+0

jsonをURLから取得してviewDidLoadのreadDataを呼び出して、ディスク上にデータがあるかどうか、またはWebからダウンロードする必要があるかどうかを確認するために、タスク完了ハンドラ内でsaveDataを呼び出すことができます。 –

+0

@RamonVasconceolos 申し訳ありませんが、私は厚いです。見せてもらえますか? – PhilipS

関連する問題