2014-11-09 7 views
0

저는 API 데이터 서버에 식품 항목과 관련된 데이터를 쿼리하는 Swift 앱을 작성하려고합니다 ... 사용 가능한 여러 가지 음식 품목이 많기 때문에 저장하고 싶습니다. 사용자가 선택했을 때 장치의 이미지. 이를 위해 SVG 이미지에서 측면로드에 SVGKit을 사용하려고합니다. 저장하려면 코어 데이터를 사용하고 싶습니다. 들어오는 데이터를 구문 분석하기 위해 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에 대한 데이터 모델에서 이미지 속성이 변형 가능 –

답변

0

오류는 메모리 할당과 관련이 없습니다. NSCoding이 속성 클래스에 대해 구현되는 경우에만 변환 가능한 속성을 코어 데이터에 저장할 수 있습니다. 나는 SVGImage가 NSCoding을 구현하지 않는 것을 본다. 따라서 SVGImage를 저장하려면 SVGImage의 서브 클래스 MySVGImage (또는 범주 SVGImage + Coding)를 만든 다음 NSCoding 프로토콜을 구현할 수 있습니다. SVGImage를 직렬화 가능하게 만드는 것은 어려운 작업이거나 실용적이지 않을 수도 있고 가능하지 않을 수도 있습니다. 그것은 SVGImage에 달려 있습니다. 따라서 UIImage 데이터와 같은 핵심 데이터를 통해 실제로 저장되기를 원하는 SVGImage 객체의 정보 만 저장하는 것에 대해 생각할 수 있습니다.

+0

으로 설정되어야합니다. 그렇다면 SVG 마크 업 대신 SVG 마크 업만 저장하는 것이 현명합니까? 그러나 그렇게하면 SVG를 매번 파싱하게 될 것입니다. 이것은 최적이 아닙니다. 맞습니까? –