Я просматривал различные другие посты SO, касающиеся моей проблемы, но, похоже, не хватает какой-то ключевой точки!
У меня есть массив JSON, который загружается из удаленного места через Alamofire, который я затем пытаюсьчитать и хранить в Realm.
Я пытался свести код к минимуму, но, надеюсь, это все еще имеет смысл.Каждый объект массива на самом деле содержит около 10 различных свойств, но я только что оставил в заголовке, чтобы упростить его.
Проблема, с которой я сталкиваюсь,
downloadMedia () - error: keyNotFound (CodingKeys(stringValue: "title" ... debugDescription: "Нет значения, связанного с ключом CodingKeys (stringValue: \" title \ "...
Я думаю, что проблема в том, что json является объектом, которыйсодержит массив (мультимедиа), и он пытается декодировать из объекта вместо массива, но я до сих пор не могу понять, как это сделать. Без сомнения, я буду шлепать себя, когда кто-то укажет, что я пропускаю однострочник!
В некоторых из моих предыдущих работ у меня был массив объектов, правильно помещенных в Realm, но для этого сценария у меня был «корневой» объект, который содержал RealmSwift.List, но это привело к созданию двух объектов области,Корневой объект, который имел указатель на массив MyObject и MyObject.Я пытаюсь избежать этого, и только один объект "MediaMdl" в области.его возможно?
JSON
{
"media": [
{
"title": "Clerk",
},
{
"title": Jay and Silent Bob Strike Back",
},
{
"title": "Mallrats",
}
]
}
Просмотр контроллера
import UIKit
class MediaGridVC: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
DataService.instance.downloadMedia(completion: { (mediaSuccess) in
print("Media Data Success = \(mediaSuccess)")
})
}
}
Объектная модель
import Foundation
import Realm
import RealmSwift
@objcMembers class MediaMdl: Object, Decodable {
dynamic var title: String? = nil
enum CodingKeys: String, CodingKey {
case title
}
required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
title = try container.decode(String.self, forKey: .title)
super.init()
}
required init() {
super.init()
}
required init(value: Any, schema: RLMSchema) {
super.init(value: value, schema: schema)
}
required init(realm: RLMRealm, schema: RLMObjectSchema) {
super.init(realm: realm, schema: schema)
}
}
Служба данных
import Foundation
import Alamofire
import AlamofireObjectMapper
import ObjectMapper
import SwiftyJSON
import Realm
import RealmSwift
class DataService {
static let instance = DataService()
func downloadMedia(completion: @escaping CompletionHandler) {
Alamofire.request("URL_TO_JSON", method: .get, parameters: nil, encoding: JSONEncoding.default, headers: HEADER).responseJSON { (response) in
if response.result.value != nil {
guard let data = response.data else {
print("downloadMedia() - data error!")
completion(false)
return
}
do {
let mediaData = try JSONDecoder().decode(MediaMdl.self, from: data)
// TODO.. write to realm db
//let realm = try Realm()
//try realm.write {
// realm.add(mediaData)
//}
completion(true)
return
}
catch let error {
print("downloadMedia() - error: \(error)")
completion(false)
return
}
}
else {
print("downloadMedia() nil!")
completion(false)
}
}
}
}