JSONData after format:
(title: "delectus aut autem", completed: false)
(title: "delectus aut autem", completed: true)
(title: "delectus aut autem", completed: true)
(title: "delectus aut autem", completed: false)
My Struct:
struct TodoListResponse: Decodable {
let title: String
var completed: Bool
}
Realm DataModel
class TodoIItemList: Object {
@objc dynamic var title: String = ""
@objc dynamic var completed: Bool = false
}
ParseJson Data and by didUpdateData()
delegate function sending Data to ViewController
func parseJSON(toDoListData: Data) {
let decoder = JSONDecoder()
do {
let jsonData = try decoder.decode([TodoListResponse].self, from: toDoListData)
self.delegate?.didUpdateData(jsonData)
} catch{
delegate?.didFailWithError(error: error)
}
}
In my viewcontroller
, didUpdateData()
I want to save my array to Realm but i am failed. How can i save data here.
import UIKit
import RealmSwift
class ViewController: UIViewController {
let realm = try! Realm()
var todoLists: Results<TodoIItemList>?
@IBOutlet weak var todoListTable: UITableView!
var dataManager = DataManager()
var listArray = [TodoListResponse]()
override func viewDidLoad() {
super.viewDidLoad()
dataManager.delegate = self
dataManager.fetchTodoListInformation()
//MARK: - call UITableView
setupTableView()
}
//MARK: - Setup or Register UITableView
func setupTableView() {
todoListTable.dataSource = self
todoListTable.register(UINib(nibName: K.cellNibName, bundle: nil), forCellReuseIdentifier: K.cellReuseIdentifier)
//todoListTable.separatorStyle = .none
todoListTable.contentInsetAdjustmentBehavior = .never
todoListTable .reloadData()
}
func save(_ object: [Object]) {
do{
try realm.write{
realm.add(object)
}
}catch{
print(error)
}
}
Delegate Method:
//MARK: - TodoDataManagerDelegate
extension ViewController: TodoDataManagerDelegate{
func didUpdateData(_ todoData: [TodoListResponse]) {
listArray = todoData
print("list: \(todoData)")
DispatchQueue.main.async {
//save(todoItem: listArray)
self.todoListTable.reloadData()
}
}
}
Thanks in advance.
save(todoItem: listArray)
doesn't work because save
expects an [Object]
, but listArray
is a [TodoListResponse]
.
What you are missing is the step that converts your codable struct TodoListResponse
to the Realm model TodoIItemList
. I would write the save
method like this:
func save(_ todoListResponses: [TodoListResponse]) {
do{
try realm.write{
for response in todoListResponses {
let object = TodoIItemList()
object.title = response.title
object.completed = response.completed
realm.add(object)
}
}
}catch{
print(error)
}
}
Now save(todoItem: listArray)
should work.
If there are many properties that needs to be set in TodoIItemList
, you can move the "copying properties" logic to a convenience initialiser of TodoIItemList
that initialises a TodoIItemList
from a TodoListResponse
.