簡體   English   中英

如何在 Swift 中將 JSON 數組保存到 Realm?

[英]How to save a JSON array to Realm in Swift?

格式化后的 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()
        }
    }
    
}

提前致謝。

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

您缺少的是將可編碼結構TodoListResponse轉換為 Realm 模型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的便利初始化程序,該初始化TodoIItemListTodoListResponse初始化TodoListResponse

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM