我正在尝试构建一个Swift应用程序,它将查询我的API服务器中与食品相关的数据.因为有这么多不同的食品可用,我只想存储在设备上的图像,当用户选择这样做。为此,我尝试使用SVGKit在SVG映像中进行侧加载。为了存储它们,我想使用Core数据。我还使用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在很大程度上处理了分配问题。无论如何,如果有人知道我能做些什么来解决这个问题,我会非常感激的!
发布于 2014-11-09 07:18:29
错误与内存分配无关。只有当属性的类实现NSCoding时,才能将可转换的属性存储在核心数据中。我看到SVGImage没有实现NSCoding。因此,如果要存储SVGImage,可以创建SVGImage的子类MySVGImage (或类别SVGImage+Coding),然后实现NSCoding协议。使SVGImage可串行化可能是一项困难的任务,或者不可行,甚至是不可能的。这取决于SVGImage。因此,您可能会考虑只存储您真正希望通过核心数据存储的SVGImage对象的信息(比如UIImage数据)。
https://stackoverflow.com/questions/26824155
复制相似问题