Ios 脱机使用JSON数据Swift 3

Ios 脱机使用JSON数据Swift 3,ios,json,core-data,swift3,Ios,Json,Core Data,Swift3,我是初学者,所以请温柔一点。 好的,我成功地从服务器解析了我的JSON,可以访问它的所有内容,但我知道我被困在这里了: //Functionn for fetching API data func fetchRates(){ //Set EndPoint URL let url = URL(string: endPoint) URLSession.shared.dataTask(with: url!) { (data, response, error) in

我是初学者,所以请温柔一点。 好的,我成功地从服务器解析了我的JSON,可以访问它的所有内容,但我知道我被困在这里了:

//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数据(供脱机使用)
  • 在应用程序启动时更新数据并覆盖旧数据
到目前为止,我遇到的可能性是CoreData,它看起来非常混乱和复杂,而且我根本不知道这个领域


如果这看起来真的很愚蠢的话,我将非常感谢您的帮助,也非常抱歉。因为您有JSON解析,我将创建一个对象类来使用核心数据存储数据。一开始,核心数据的使用涉及很多方面,但如果您打算继续进行iOS开发,那么花时间学习是非常值得的

我也不知道你打算用你的应用程序做什么,或者目的是什么,根据你的目的,核心数据可能有点过头了,但你每次都可以保存更新的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.
更新:好的,我想我现在明白你的问题了。有两种方法可以将数据返回到视图控制器:1。委托模式2.0。我个人喜欢使用委托而不是闭包

对于学员,您需要创建一个协议:

protocol SessionDataTaskComplete {
    func dataDownloaded(parsedJson : [String : Double])
}
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
    }
}
在URLSession类中,您需要一个类变量来保存该协议委托:

var dataTaskCompleteDelegate : SessionDataTaskComplete?
然后,您需要让视图控制器实现该协议:

protocol SessionDataTaskComplete {
    func dataDownloaded(parsedJson : [String : Double])
}
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中到处都使用委托模式。试着将它们视为一个对象,将职责/任务分配给另一个对象

我读过委托书,我真的很难理解任何东西…我尝试过使用上面的代码,但我无法让它工作,它不允许我在ViewDod Load
var dataTaskCompleteDelegate:SessionDataTaskComplete?
我想这是因为我的fetchRates()在ViewController类中(在ViewDidLoad之外)或其他什么,但我真的很难理解这是为什么,通常情况下,您的会话任务和数据模型更改会有一个单独的类。在您的情况下,因为它都在您的视图控制器中,而不是调用:dataTaskCompleteDelegate!.dataDownloaded(parsedJson:ratesJson),并创建协议,只需调用另一个函数并传递数据。我强烈建议您研究并学习MVC(模型-视图-控制器)体系结构。好的,我将暂缓讨论,看看MVC,因为我真的不知道如何做thx以获得帮助