0

APIサーバーに食品に関連するデータを照会するSwiftアプリを構築しようとしています...非常に多くの異なる食品が利用可能であるため、ユーザーが選択したときにのみデバイスに画像を保存したいそうするために。このために、SVGKitを使用して SVG 画像をサイドロードしようとしています。それらを保存するには、コアデータを使用したいと思います。また、 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]: 警告: -finishEncoding を呼び出さずに NSKeyedArchiver が割り当て解除されました。

*** キャッチされない例外 'NSInvalidArgumentException' によりアプリを終了します。理由: '-[SVGKImage encodeWithCoder:]: 認識されないセレクターがインスタンス 0x16eea720 に送信されました'

私はこれを診断できるほどメモリ割り当てについて十分に知りません。私の最初の考えでは、Swift がほとんどの部分で割り当てを処理したのでしょうか? とにかく、これを解決するために私にできることを誰かが知っていれば、本当に感謝しています!

4

1 に答える 1