Попытка сохранить изображение SVGKit в CoreData

Я пытаюсь создать приложение 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 ответ

Решение

Ошибка не в распределении памяти. Вы можете хранить трансформируемые атрибуты в основных данных, только если и когда NSCoding реализован для класса атрибута. Я вижу, SVGImage не реализует NSCoding. Таким образом, если вы хотите сохранить SVGImage, вы можете создать подкласс MySVGImage (или создать категорию SVGImage+Coding) SVGImage, а затем реализовать протокол NSCoding. Сделать сериализуемый SVGImage может быть трудной задачей или неосуществимым, или даже невозможным. Это зависит от SVGImage. Таким образом, вы можете подумать о хранении только той информации об объекте SVGImage, которую вы действительно хотите сохранить через основные данные (например, данные UIImage).

Другие вопросы по тегам