Alamofire JSON Array для Realb Db - PullRequest
       59

Alamofire JSON Array для Realb Db

0 голосов
/ 05 февраля 2019

Я просматривал различные другие посты 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)
            }
        }
    }
}
...