I started my iOS Journey just 2 weeks ago & I am faced with a Brick wall at the moment, I need save API responses directly into CoreData, Currently I have to loop my Object after Decoded so I can bring out the values individually & save them.
Is there a way I can do it without looping at all?
Let me show you what I have done already below:
I have my Structs named as Example:
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
}
}
I also have my URLSession code below:
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()
I also have below my method which actually saves my data when I 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)")
}
}
I am new to this, so no Information is unnecessary please. I need someone to put me in right direction, Most tutorials I see online are either too advanced or doing something different.