我正在尝试构建一个Swift应用程序,它将向我的API服务器查询与食品相关的数据......因为有很多不同的食品可供使用,我只想将图像存储在设备上当用户选择这样做时。为此,我尝试使用SVGKit来加载SVG图像。为了存储它们,我想使用Core Data。我还使用SwiftyJSON来解析传入的数据。免责声明:我在Swift和iOS开发方面都很陌生。
我已经设置了SVGKit,关于我的请求的其他所有内容似乎都运行正常(数据确实成功返回,并且除了SVGKImage之外我没有任何问题存储)。
以下是函数内部,并且已经有一个托管对象上下文:
var request = NSMutableURLRequest(URL: NSURL(string: "\(apiImageURLBase)/\(query)")!)
NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue()) { (response: NSURLResponse!, data: NSData!, error: NSError!) -> Void in
let retrievedData = JSON(data: data, options: nil, error: nil)
if let imageName = retrievedData["name"].string {
let imageSVGData = retrievedData["data"].string
let imageColor = UIColor(hexString: retrievedData["color"].string)
let svgParse: SVGKParser = SVGKParser(source: SVGKSource(inputSteam: NSInputStream(data: imageSVGData!.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!)))
svgParse.addDefaultSVGParserExtensions()
let imageSVG = SVGKImage(parsedSVG: svgParse.parseSynchronously(), fromSource: nil)
FoodImage.createInManagedObjectContext(managedObjectContext!, name: imageName, added: NSDate(), image: imageSVG, color: imageColor!)
}
}
这就是我设置托管对象及其保存方法的方法:
class FoodImage: NSManagedObject {
@NSManaged var name: String
@NSManaged var added: NSDate
@NSManaged var image: SVGKImage
@NSManaged var color: UIColor
class func createInManagedObjectContext(context: NSManagedObjectContext, name: String, added: NSDate, image: SVGKImage, color: UIColor) -> NSManagedObject {
let entity = NSEntityDescription.entityForName("FoodImage", inManagedObjectContext: context)
let item = FoodImage(entity: entity!, insertIntoManagedObjectContext: context)
item.name = name
item.added = added
item.image = image
item.color = color
if !context.save(nil) {
println("Could not save.")
}
return item
}
}
我执行保存时遇到的问题是if !context.save(nil)
我遇到以下错误:
- [SVGKImage encodeWithCoder:]:无法识别的选择器发送到实例0x16eea720
*** - [NSKeyedArchiver dealloc]:警告:NSKeyedArchiver在没有调用-finishEncoding的情况下解除分配。
***由于未捕获的异常终止应用程序' NSInvalidArgumentException',原因:' - [SVGKImage encodeWithCoder:]:无法识别的选择器发送到实例0x16eea720'
我真的不太了解内存分配以便能够诊断出来,而我最初的想法是Swift大部分处理了分配?无论如何,如果有人知道我能做些什么来解决这个问题,我会非常感激!
答案 0 :(得分:0)
错误与内存分配无关。只有在为属性类实现NSCoding时,才能将可转换属性存储在核心数据中。我看到SVGImage没有实现NSCoding。因此,如果要存储SVGImage,可以创建SVGImage的子类MySVGImage(或类别SVGImage + Coding),然后实现NSCoding协议。使SVGImage可序列化可能是困难的任务或不可行或甚至不可能。这取决于SVGImage。因此,您可能会考虑仅存储您希望通过核心数据(如UIImage数据)存储的SVGImage对象的信息。