【问题标题】:Trying to save SVGKit image to CoreData尝试将 SVGKit 图像保存到 CoreData
【发布时间】:2015-01-05 14:19:58
【问题描述】:

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

【问题讨论】:

  • 我应该补充一点,在我的 FoodImage 数据模型中,图像属性设置为可转换

标签: ios core-data swift dealloc svgkit


【解决方案1】:

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

【讨论】:

  • 那么只存储 SVG 标记(在解析之前)而不是 SVGKImage 是否明智?但是,如果我这样做,这意味着我每次都会解析 SVG,这不是最佳的,对吧?
猜你喜欢
  • 1970-01-01
  • 2021-05-27
  • 2015-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-16
  • 1970-01-01
相关资源
最近更新 更多