【问题标题】:How to save a JSON array to Realm in Swift?如何在 Swift 中将 JSON 数组保存到 Realm?
【发布时间】:2020-09-08 03:13:23
【问题描述】:

格式化后的JSONData:

(title: "delectus aut autem", completed: false)
(title: "delectus aut autem", completed: true)
(title: "delectus aut autem", completed: true)
(title: "delectus aut autem", completed: false)

我的结构:

struct TodoListResponse: Decodable {
    let title: String
    var completed: Bool
}

领域数据模型

class TodoIItemList: Object {
    @objc dynamic var title: String = ""
    @objc dynamic var completed: Bool = false
}

ParseJson 数据并通过didUpdateData() 委托函数将数据发送到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)
    }
}

在我的viewcontrollerdidUpdateData() 中,我想将我的数组保存到 Realm,但我失败了。我如何在此处保存数据。

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)
        }
    }

委托方法:

//MARK: - TodoDataManagerDelegate
extension ViewController: TodoDataManagerDelegate{
    func didUpdateData(_ todoData: [TodoListResponse]) {
        listArray = todoData
        
        print("list: \(todoData)")
        DispatchQueue.main.async {
            //save(todoItem: listArray)
            self.todoListTable.reloadData()
        }
    }
    
}

提前致谢。

【问题讨论】:

    标签: json swift realm


    【解决方案1】:

    save(todoItem: listArray) 不起作用,因为 save 需要 [Object],但 listArray[TodoListResponse]

    您缺少的是将可编码结构TodoListResponse 转换为领域模型TodoIItemList 的步骤。我会这样写save 方法:

    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)
        }
    }
    

    现在save(todoItem: listArray) 应该可以工作了。

    如果有很多属性需要在TodoIItemList 中设置,您可以将“复制属性”逻辑移动到TodoIItemList 的便利初始化程序,该初始化程序从TodoListResponse 初始化TodoIItemList

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多