2017-02-08 4 views
0

私は初心者ですので、やさしくしてください。 [OK]をので、私は成功し、サーバからの私のJSONを解析し、その内容のすべてにアクセスすることができますが、私は一種のここにこだわって知っている:オフラインでJSONデータを使用するSwift 3

//Functionn for fetching API data 
func fetchRates(){ 

    //Set EndPoint URL 
    let url = URL(string: endPoint) 

    URLSession.shared.dataTask(with: url!) { (data, response, error) in 

     if error != nil { 

      print(error as Any) 

     } 

     do { 

      let json = try? JSONSerialization.jsonObject(with: data!, options: []) 

      let dictonary = json as? [String: Any?] 

      let ratesJson = dictonary?["rates"] as? [String: Double] 

      print(ratesJson as Any) 



     } catch let jsonError { 

      print(jsonError) 

     } 

    }.resume() 


} 

は、今私は、この機能のうち、私のratesJson辞書を取得し、実際に使用したいですその内容はいくつかの計算を行うが、何時間も試して検索しても、私はまだ考えていない。私はしたい

  • JSONデータは(オフラインで使用するため)presistently格納されます
  • アップデートでは、Dataときアプリが起動し、私は「

可能性古いデータを上書きしますCoreDataは本当に混乱して複雑に見えますが、私は本当に知りません。これはあなたがJSONの解析を持っているので、私はコアデータを使用してデータを格納するオブジェクトクラスを作成します

答えて

0

本当に愚かなようであれば

ヘルプは非常に高く評価して申し訳ありませんされるだろう。最初はコアデータの使用量が多いですが、iOS開発を継続する予定がある場合は、時間を投資する価値があります。 Core Data Tuts

あなたのアプリや目的の中で何をやっているのか分かりませんし、目的に応じてCore Dataがちょっと残念ですが、毎回更新されたJSONを保存してファイルを上書きすることができますデバイスのドキュメントのdirで、データを読み込んで再度解析します。

あなたは使用してOutputStreamにJSONデータを書き込むことができます。

JSONSerialization.writeJSONObject(_ obj: Any, to stream: OutputStream, options opt: JSONSerialization.WritingOptions = [], error: NSErrorPointer) 
//Write JSON data into a stream. The stream should be opened and configured. 
//The return value is the number of bytes written to the stream, or 0 on error. 
//All other behavior of this method is the same as the dataWithJSONObject:options:error: method. 

UPDATE:[OK]を私は今、あなたの質問を参照してくださいと思いますが。データをView Controllerに戻すには、2通りの方法があります。1.パターンを委譲します。2. Closure。私は個人的に閉会以上の代議員を使用するのが好きです。

あなたはプロトコルを作成する必要があります代表者で

:次に、あなたが必要となります

var dataTaskCompleteDelegate : SessionDataTaskComplete? 

protocol SessionDataTaskComplete { 
    func dataDownloaded(parsedJson : [String : Double]) 
} 

そして、あなたのURLSessionクラスの内部で使用すると、そのプロトコルデリゲートを保持するクラス変数が必要になりますビューコントローラにそのプロトコルを実装させる:

class MyViewController: UIViewController, SessionDataTaskComplete { 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     //Also assign your viewController as your URLSession's SessionDataTaskComplete delegate 
     myURLSession.dataTaskCompleteDelegate = self 
    } 

    func dataDownloaded(parsedJson : [String : Double]) { 
     //Handle data as you wish here 
    } 
} 

今すぐあなたのfetchRatesに()あなたが戻ってあなたのViewControllerにデータを渡すためにそのデリゲートを使用することができます。

func fetchRates(){ 

//Set EndPoint URL 
let url = URL(string: endPoint) 

URLSession.shared.dataTask(with: url!) { (data, response, error) in 

    if error != nil { 

     print(error as Any) 

    } 

    do { 

     let json = try? JSONSerialization.jsonObject(with: data!, options: []) 

     let dictonary = json as? [String: Any?] 

     let ratesJson = dictonary?["rates"] as? [String: Double] 

     //print(ratesJson as Any) 
     if (dataTaskCompleteDelegate != nil) { 
      dataTaskCompleteDelegate!.dataDownloaded(parsedJson: ratesJson) 
     } 



    } catch let jsonError { 

     print(jsonError) 

    } 

}.resume() 


} 

デリゲートパターンを使用に慣れていない場合、それは私はそれとして、過ごす時間の学習を示唆している何か他のものですiOS SDKで全面的に使用されています。それらを義務/タスクを別のオブジェクトに割り当てるオブジェクトとして考えることを試みてください。

+0

私は代議員を読み上げましたが、何かを理解するのが本当に困っています...上のコードを試してみましたが、それを動作させることができませんでした。ViewDidの内部ではできません。var dataTaskCompleteDelegate:SessionDataTaskComplete?をロードします。これは、私のfetchRates()がViewControllerクラス(外部ViewDidLoadのようなものだけど、私は本当にわくわくしています。 –

+0

それが理由です。通常、セッションタスクとデータモデルの変更に対して別のクラスがあります。あなたのケースでは、それはあなたのビューコントローラ内にあるので、dataTaskCompleteDelegate!.dataDownloaded(parsedJson:ratesJson)を呼び出す代わりに、プロトコルを作成するだけで別の関数を呼び出してデータを渡します。 MVC(Model-View-Controller)のアーキテクチャーを調べて学ぶことを強くお勧めします。 –

+0

私は実際に何のためにthxを助けるために考えていないので、よくこれを延期してMVCを見てみるつもりです –

関連する問題