2014-11-09 40 views
0

我試圖建立一個斯威夫特應用程序,將查詢我的API服務器相關的食品數據......因爲有這麼多不同的食物,我只想存儲當用戶選擇這樣做時,設備上的圖像。爲此,我試圖使用SVGKit來側載SVG圖像。要存儲它們,我想使用Core Data。我還使用SwiftyJSON來解析傳入的數據。免責聲明:我在Swift和iOS開發方面很新穎。試圖SVGKit圖像保存到CoreData

我有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:]: unrecognized selector sent to instance 0x16eea720

*** -[NSKeyedArchiver dealloc]: warning: NSKeyedArchiver deallocated without having had -finishEncoding called on it.

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[SVGKImage encodeWithCoder:]: unrecognized selector sent to instance 0x16eea720'

我真的不知道內存分配是否足以診斷這個問題,我最初的想法是Swift處理大部分分配?無論如何,如果有人知道我能做些什麼來解決這個問題,我會非常感激!

+0

我應該在FoodImage的數據模型中添加圖像屬性設置爲可變形 – 2014-11-09 02:00:46

回答

0

錯誤與內存分配無關。只有在對屬性類實施NSCoding的情況下以及在何時執行NSCoding時,纔可以將可變形屬性存儲在覈心數據中。我看到SVGImage沒有實現NSCoding。因此,如果你想存儲SVGImage,你可以創建SVGImage的子類MySVGImage(或者創建一個類別SVGImage + Coding),然後實現NSCoding協議。爲了使SVGImage可序列化可能是困難的任務或不可行或甚至不可能。這取決於SVGImage。所以你可能會考慮只存儲你真正想要通過核心數據存儲的SVGImage對象的信息(比如UIImage數據)。

+0

因此,僅存儲SVG標記(在分析之前)而不是SVGKImage會是明智的嗎?但是如果我這樣做,那意味着我每次都會解析SVG,這不是最優的,對吧? – 2014-11-09 17:59:14