Хранение NSImage и NSData в приложении Cocoa Core Data - PullRequest
0 голосов
/ 20 февраля 2012

Я пишу приложение Cocoa для отображения двумерного плавающего массива. Теперь я хочу назначить эти изображения атрибуту сущности в Базовых данных, поэтому я использую преобразуемый тип данных.

Проблема начинается, когда я пытаюсь сохранить NSImage (и / или NSData) внутри сущности («TheEntity»), используя трансформируемый атрибут, назовите его «entityImage».

Вот ошибка, которую я получаю:

CoreData: error: Serious application error.  Exception was caught during Core
Data change processing.  This is usually a bug within an observer of 
NSManagedObjectContextObjectsDidChangeNotification.  Cannot create BOOL from 
object 
<4d4d002a 00003d12 7f7f7e7c 7a777470 6c67615b 554e473f 372f271e 160d04fc
f3eae2d9 d1c9c1b9 b2aba59f 9994908c 89868482 81818182 8486898c 9094999f
a5abb2b9 c1c9d1d9 e2eaf3fc 040d161e 272f373f 474e555b 61676c70 74777a7c 
...

и т. Д. (Страницы и страницы), которые выглядят как шестнадцатеричные значения для NSData, представляющего изображение.

Ниже приведены списки кодов с комментариями:

/*First create the greyscaleImage within the App (before storing to Core
  Data). The image size is Nx by Ny:  */

NSImage *greyscaleImage = [[NSImage alloc] initWithSize:NSMakeSize(Nx,Ny)]; 

/*The dataBitMapRep is constructed earlier (not shown) from a float array
using NSBitmapImageRep.  The greyscaleImage displays fine in an NSImage View,
I have been writing these to CALayers, so I won't go into those details here. */

/* "greyscaleImage" defined below can display fine within an NSImageView: */
[greyscaleImage addRepresentation:dataBitMapRep]; 

/* Create an instance of the Core-Data entity "TheEntity":  */
TheEntity *anEntityInstance = [NSEntityDescription insertNewObjectForEntityForName:@"TheEntity" inManagedObjectContext:moc];

/* Attempt to set value of entity "transformable" attribute (the line below causes the error): */
[anEntityInstance setEntityImage:greyscaleImage];

/* Have also tried using the bitmap rep directly (doesn't work): */
[anEntityInstance setEntityImage:dataBitMapRep];

/* Also tried the reverse by setting the tranformable value as NSData (rather than NSImage) and then switched my ValueTranformer output class accordingly as well as the value transformer and reverse transformer code (see the ImageTransformer Value-Transformer code below): */
 NSData *imgData = [greyscaleImage TIFFRepresentation];  
 // Store as NSData in Core Data:
 [anEntityInstance setEntityImage:imgData]; //still gives an error

Когда я использую обратный подход, описанный непосредственно выше (после настройки ValueTransformer путем переключения его типа возврата на NSImage Class, см. Код ниже), я получаю различный вид ошибки (один из этих списков для каждого изображения, только один в списке):

CoreData: error: Serious application error.  
Exception was caught during Core Data change processing.  
This is usually a bug within an observer of NSManagedObjectContextObjectsDidChangeNotification.  
Cannot create BOOL from object <NSImage 0x102271f10 Size={125, 125} 
 Reps=("NSBitmapImageRep 0x102272fa0 Size={125, 125} 
ColorSpace=(not yet loaded) BPS=8 BPP=(not yet loaded) 
Pixels=125x125 Alpha=NO Planar=NO Format=(not yet loaded) CurrentBacking=nil
(faulting) CGImageSource=0x102272070")Cannot create BOOL from object 

Трансформатор значения является базовым. Я также установил NSLogs везде, чтобы помочь устранить неполадки (они не показаны):

#import "ImageTransformer.h"
@implementation ImageTransformer
+ (BOOL)allowsReverseTransformation {return YES;}
+ (Class)transformedValueClass {
    // Have switched back and forth here to try and diagnose bug:
    return [NSData class]; // also tried: return [NSImage class];
}
- (id)transformedValue:(id)value {    
    // If returning NSData class then transformedValue is NSData:
    NSData *data = [value TIFFRepresentation]; 
    return data;
    // If returning NSImage class then transformedValue is NSImage:
    // NSImage *imageRep = [[NSImage alloc] initWithData:value];
    // return imageRep;
}
- (id)reverseTransformedValue:(id)value {
    // If returning NSData class, reverseTransformedValue is NSImage:
    NSImage *imageRep = [[NSImage alloc] initWithData:value];
    return imageRep;
    // If returning NSNSImage class, reverseTransformedValue is NSData:
    // NSData *data = [value TIFFRepresentation]; 
    // return data;
}
@end

Спасибо за любую помощь или предложения о том, почему эта проблема возникает. Я гуглил и проверил много других статей о стеке, не нашел ничего подобного.

1 Ответ

0 голосов
/ 24 февраля 2012

Я обнаружил, что ошибка, указанная выше, а именно,

Cannot create BOOL from object ...

не возникает при использовании ячейки изображения или ячейки изображения (подклассы NSImageView), а не пользовательского представления, в которое я пытался записать ранее.

См. сообщение для дополнительного обсуждения этой проблемы.

...