2014-11-09 7 views
0

Я пытаюсь создать приложение Swift, которое будет запрашивать мой сервер 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 атрибут изображения установлен на Transformable –

ответ

0

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

+0

. Было бы разумно хранить только разметку SVG (до того, как она будет разобрана) вместо SVGKImage? Однако, если я это сделаю, это означает, что я буду разбирать SVG каждый раз, что не является оптимальным, не так ли? –