代码之家  ›  专栏  ›  技术社区  ›  teh_raab

Alamofire JSON数组到领域数据库

  •  0
  • teh_raab  · 技术社区  · 6 年前

    我有一个JSON数组,它是通过Alamofire从一个远程位置拉下来的,然后我试图读取并存储在Realm中。

    我试图将代码减少到最低限度,但希望它仍然有意义。每个数组对象实际上包含大约10个不同的属性,但我只是在title中留下来简化它。

    我看到的问题是

    我认为问题是因为json是一个包含数组(媒体)的对象,它试图从对象而不是数组中解码,但我还无法找出如何做到这一点。当有人指出我漏掉了一行字时,我无疑会打自己一巴掌!

    在我之前的一些工作中,我有一个被正确地推送到领域的对象数组,但是对于那个场景,我有一个包含RealmSwift.List的“根”对象,但是这导致了两个领域对象被创建,一个根对象有指向my object数组的指针,另一个是MyObject。我试图避免这种情况,在领域中只有一个“MediaMdl”对象。这可能吗?

    {
        "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)
                }
            }
        }
    }
    
    0 回复  |  直到 6 年前