2017-02-08 4 views
0

Я новичок, поэтому, пожалуйста, будьте осторожны. Хорошо, так что я успешно разобрать мой JSON с сервера и получить доступ ко всем его содержимым, но знаю, что я вроде застрял здесь:Использовать данные JSON offline 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 (для использования в автономном режиме)
  • Обновление данных, когда приложение запускает и перезаписывать старые данные

возможности I» до сих пор встречаются CoreData, которые кажутся действительно запутанными и сложными, и Realm, которые я действительно не знаю вообще.

Помощь будет очень признателен и жаль, если это кажется действительно глупым

ответ

0

Поскольку у вас есть JSON синтаксический, я хотел бы создать класс объектов для хранения данных с использованием основных данных. Вначале много общего с использованием основных данных, но стоит потратить время на изучение, если вы планируете продолжить разработку iOS. Core Data Tuts

Я также не знаю, что вы планируете делать с вашим приложением или целью, а Core Data может быть немного переполненным в соответствии с вашей целью, но вы всегда можете сохранять обновленный JSON каждый раз, перезаписывая файл в директории документа устройства, затем прочитайте данные и снова проанализируйте их.

Вы можете записывать данные в формате JSON в виде OutputStream с помощью:

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: Хорошо, я думаю, я вижу свой вопрос сейчас. Существует два способа вернуть данные к контроллеру представления: 1. Делегировать шаблон 2.Скрытия. Мне лично нравится использовать делегатов для закрытия.

С делегатами вам нужно будет создать протокол:

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

А внутри вашего класса URLSession вам потребуется переменной класса держать этот протокол делегата:

var dataTaskCompleteDelegate : SessionDataTaskComplete? 

Затем вам нужно будет чтобы ваш контроллер просмотра реализовал этот протокол:

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


} 

Если вы не знакомы с использованием шаблона делегата, то есть что-то еще, что я хотел бы предложить обучение тратить время, как это используется с SDK iOS. Постарайтесь думать о них как о объекте, назначающем долг/задачу другому объекту.

+0

Я прочитал делегатов, и у меня действительно есть проблемы с пониманием чего-либо ...и я попытался использовать ваш код выше, но я не могу заставить его работать, он не позволяет мне делать внутри ViewDid Load 'var dataTaskCompleteDelegate: SessionDataTaskComplete?' Я предполагаю, что это потому, что мой fetchRates() находится внутри класса ViewController (вне ViewDidLoad) или что-то в этом роде, но я действительно пытаюсь понять –

+0

Да, это причина, обычно у вас будет отдельный класс для ваших задач сеанса и изменений модели данных. В вашем случае, поскольку это все в вашем контроллере просмотра, вместо вызова: dataTaskCompleteDelegate! .dataDownloaded (parsedJson: ratesJson) и создания протокола, просто вызовите другую функцию и передайте данные. Я настоятельно рекомендую вам изучить и изучить MVC (архитектура Model-View-Controller). –

+0

Хорошо, я собираюсь удержаться на этом и взглянуть на MVC, так как я действительно не знаю, что делать thx за помощь –