将自定义对象保存到API

时间:2018-02-17 18:11:44

标签: swift core-data swifty-json

我正在从在线API接收JSON数据,并且我试图将数据放入自定义TVShow对象,然后使用CoreData保存这些对象。我可以正确打印从JSON对象获取的值,但是当我尝试创建TVShow对象并使用CoreData保存它时,我收到错误。有什么建议吗?

Alamofire.request("https://api.tvmaze.com/shows?page=0").responseJSON { 
(responseData) -> Void in
            if((responseData.result.value) != nil) {
                let swiftyJsonVar = JSON(responseData.result.value!)
                //print(swiftyJsonVar)
                for item in swiftyJsonVar.array! {
                    print(item["name"].stringValue)
                    print(item["genres"].arrayValue)
                    print(Int32(item["id"].intValue))
                    print(item["type"].stringValue)
                    print(item["language"].stringValue)
                    print(item["summary"].stringValue)


                    if CoreDataHandler.saveObject( 
                        id:Int32(item["id"].intValue), 
                        name:item["name"].stringValue, 
                        type:item["type"].stringValue, 
                        language:item["language"].stringValue, 
                        summary:item["summary"].stringValue, 
                        genres:item["genres"].arrayValue) {
                            self.tvshows = CoreDataHandler.fetchObject()
                        }
                    }

                }
            }

我收到此错误:

  

[_ SwiftValue encodeWithCoder:]:无法识别的选择器发送到实例0x6080000a8160

     

2018-02-15 10:42:38.448476-0800电视核心数据[81985:5602062] *** - [NSKeyedArchiver dealloc]:警告:NSKeyedArchiver在没有调用-finishEncoding的情况下解除分配。

     

2018-02-15 10:42:38.458710-0800电视核心数据[81985:5602062] ***因未捕获的异常终止应用程序' NSInvalidArgumentException',原因:' - [_ SwiftValue encodeWithCoder:]:发送到实例的无法识别的选择器

但是,当我手动创建对象时,使用for循环,这行代码可以正常工作

for item in 1...10 {

            if CoreDataHandler.saveObject(id: Int32(item), name: "tim\(item)", type: "drama\(item)", language: "english", summary: "\(item) time running out", genres: ["suspense","drama"]) {
                self.tvshows = CoreDataHandler.fetchObject()

        }

enter image description here

1 个答案:

答案 0 :(得分:0)

缺少NSCoding协议的实现。

  

NSKeyedArchiver对您希望持久化的任何符合NSCoding的类进行编码(保存)和解码(检索)。虽然NSKeyedArchiver不像Core Data那样强大(它更慢且手动),但它完成了持久化数据所需的工作,并且可以不如Core Data复杂。

     

NSCoding是一种需要两种方法的协议 - 必需的init(编码器解码器:NSCoder)和编码(使用编码器:NSCoder)。如果我创建一个符合NSObject和NSCoder的类,那么我的类可以被序列化(从其当前数据结构转换为可以存储为字节的格式)并反序列化(从字节提取到数据结构中)到可以保存到用户的磁盘。

示例代码:

class Example : NSObject, NSCoding {

    struct Keys {
        static let Name = "name"
    }

    var name: String

    init(name: String) {
        self.name = name
    }

    required init?(coder aDecoder: NSCoder) {
        guard let decodedName = aDecoder.decodeObject(forKey: Keys.Name) as? String else {
            return nil
        }
        self.name = decodedName
    }

    func encode(with aCoder: NSCoder) {
        aCoder.encode(self.name, forKey: Keys.Name)
    }
}