试图将SVGKit图像保存到CoreData

时间:2014-11-09 01:55:15

标签: ios core-data swift dealloc svgkit

我正在尝试构建一个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大部分处理了分配?无论如何,如果有人知道我能做些什么来解决这个问题,我会非常感激!

1 个答案:

答案 0 :(得分:0)

错误与内存分配无关。只有在为属性类实现NSCoding时,才能将可转换属性存储在核心数据中。我看到SVGImage没有实现NSCoding。因此,如果要存储SVGImage,可以创建SVGImage的子类MySVGImage(或类别SVGImage + Coding),然后实现NSCoding协议。使SVGImage可序列化可能是困难的任务或不可行或甚至不可能。这取决于SVGImage。因此,您可能会考虑仅存储您希望通过核心数据(如UIImage数据)存储的SVGImage对象的信息。