我正在从在线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()
}
答案 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)
}
}