JSONDecoder сохраняет данные JSON в CoreData без цикла - PullRequest
0 голосов
/ 16 февраля 2019

Я начал свое путешествие по iOS всего 2 недели назад, и на данный момент я столкнулся с кирпичной стеной, мне нужно сохранить ответы API непосредственно в CoreData. В настоящее время я должен зациклить свой объект после Decoded, чтобы я мог вывести значения по отдельностии сохраните их.

Есть ли способ, которым я могу сделать это без зацикливания вообще?

Позвольте мне показать вам, что я уже сделал ниже:

У меня есть свои структурыназван в качестве примера:

struct Example: Codable {
    let data:[MyDataClass]

    enum CodingKeys: String, CodingKey {
        case data
    }
}

struct MyDataClass: Codable {
    let name: String
    let age: String
    let gender: String

    enum CodingKeys: String, CodingKey {
        case name
        case age
        case gender
    }
}

У меня также есть мой код URLSession ниже:

let parameters = ["page": 1] as [String : Any]
        let jsonData = try? JSONSerialization.data(withJSONObject: parameters)

        let url = URL(string: "http://example.com")
        var request = URLRequest(url: url!)
        request.setValue("application/json", forHTTPHeaderField: "Content-Type")
        request.httpMethod = "POST" //set http method as POST
        request.httpBody = jsonData

        let task = URLSession.shared.dataTask(with: request) {(data, response, error) in
            guard error == nil else {
                print("returning error")
                return
            }
            guard let content = data else {
                print("not returning data")
                return
            }
            do {

                if let httpResponse = response as? HTTPURLResponse {
                    if(httpResponse.statusCode == 200){
                        let decoded = try JSONDecoder().decode(Example.self, from: content)

                        // Currently I am looping the data and saving it,
                        // But I want to save it directly with JSON.

                        let list = decoded.data.MyDataClass
                        if(!list.isEmpty){
                            for index in 0...list.count-1 {
                                    // call save method here
                            }
                        }


                    }
                }

            } catch {
                print("Got an Error", error.localizedDescription)
            }
        }
        task.resume()

У меня также есть метод ниже, который фактически сохраняет мои данные, когда я LOOP.

func saveMyList(name: String,
                         age: Int,
                         gender: String) {

        guard let appDelegate =
            UIApplication.shared.delegate as? AppDelegate else {
                return
        }

        let managedContext = appDelegate.persistentContainer.viewContext
        let entity = NSEntityDescription.entity(forEntityName: "ExampleEntity", in: managedContext)!
        let myList = NSManagedObject(entity: entity, insertInto: managedContext)
        myList.setValue(name, forKeyPath: "name")
        myList.setValue(age, forKeyPath: "age")
        myList.setValue(gender, forKeyPath: "gender")
        do {
            try managedContext.save()
        } catch let error as NSError {
            print("Could not save list. \(error), \(error.userInfo)")
        }
    }

Я новичок в этом, поэтому никакая информация не нужна, пожалуйста.Мне нужен кто-то, чтобы направить меня в правильном направлении. Большинство учебных пособий, которые я вижу в Интернете, либо слишком продвинуты, либо делают что-то другое.

...