Поскольку у вас есть 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. Постарайтесь думать о них как о объекте, назначающем долг/задачу другому объекту.
Я прочитал делегатов, и у меня действительно есть проблемы с пониманием чего-либо ...и я попытался использовать ваш код выше, но я не могу заставить его работать, он не позволяет мне делать внутри ViewDid Load 'var dataTaskCompleteDelegate: SessionDataTaskComplete?' Я предполагаю, что это потому, что мой fetchRates() находится внутри класса ViewController (вне ViewDidLoad) или что-то в этом роде, но я действительно пытаюсь понять –
Да, это причина, обычно у вас будет отдельный класс для ваших задач сеанса и изменений модели данных. В вашем случае, поскольку это все в вашем контроллере просмотра, вместо вызова: dataTaskCompleteDelegate! .dataDownloaded (parsedJson: ratesJson) и создания протокола, просто вызовите другую функцию и передайте данные. Я настоятельно рекомендую вам изучить и изучить MVC (архитектура Model-View-Controller). –
Хорошо, я собираюсь удержаться на этом и взглянуть на MVC, так как я действительно не знаю, что делать thx за помощь –