Вставьте пользовательский массив в CoreData, используя NSBatchInsertRequest - PullRequest
1 голос
/ 11 апреля 2020

У меня есть пользовательский массив, соответствующий моей модели сущности CoreData. Цель состоит в том, чтобы вставить это в мою таблицу CoreData, используя NSBatchInsertRequest. Проблема в том, что Мой пользовательский массив не относится к типу [[String: Any]], который ожидается от типа объектов NSBatchInsertRequest. Как я могу достичь этого без зацикливания и преобразования их в пары ключ-значение (если I l oop, цель NSBatchInsertRequest будет бесполезной). Я попытался обойти и застрял в середине. То, что я до сих пор делал, это ниже.

Пользовательская модель

struct DataModel:Codable {
  let id:Int?
  let title:String?
  let descriptionText:String?
}

Поместите Im застрявшим с ошибкой "Невозможно преобразовать значение типа '[DataModel]' в ожидаемый тип аргумента '[[ Строка: Любая]] '"

func saveData(model: [DataModel]) {

     let entity =  NSEntityDescription.entity(forEntityName: "User", in: managedObjectContext)
    let insertRequest = NSBatchInsertRequest(entity:entity!, objects: model)//Error is here

    try! context?.execute(insertRequest)
    try! context?.save()

}

До сих пор я пытался создать расширение для преобразования его в словарь (что я не уверен, что это лучший вариант)

extension Encodable {
 subscript(key: String) -> Any? {
    return dictionary[key]
 }
 var dictionary: [String: Any] {
    return (try? JSONSerialization.jsonObject(with: JSON.encoder.encode(self))) as? [String: Any] ?? [:]
 }
}


struct JSON {
 static let encoder = JSONEncoder()
}

Но это преобразует только один объект внутри массива (только если вы указали индекс). Каков наилучший способ достижения моей цели?

1 Ответ

0 голосов
/ 11 апреля 2020

Вы уже написали var dictionary в extension Encodable, чтобы получить словарную версию вашей модели. Теперь вы можете отобразить массив моделей в методе saveData.

let dictionaries = model.map {$0.dictionary}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...