I have used transformable properties of Core Data before but not with C
objects like CMTime
.
I need to store a CMTime
on Core Data using transformable.
On the Model object I have declared this as transformable.
@property (nonatomic, retain) id tempo;
I understand that CMTime
is a C
object and I need to convert this to a NSDictionary and serialize it, so I can store on Core Data.
On the NSManagedObject
class, I have this...
+(Class)transformedValueClass
{
return [NSData class];
}
+(BOOL) allowsReverseTransformation
{
return YES;
}
-(id)transformedValue:(id) value
{
CFDictionaryRef dictTime = CMTimeCopyAsDictionary(?????, kCFAllocatorDefault);
NSDictionary *dictionaryObject = [NSDictionary dictionaryWithDictionary:(__bridge NSDictionary * _Nonnull)(dictTime)];
return [NSKeyedArchiver archivedDataWithRootObject:dictionaryObject];
}
-(id)reverseTransformedValue:(id)value
{
// not complete ???
return (NSDictionary*) [NSKeyedUnarchiver unarchiveObjectWithData:value];
}
The ?????
is my problem. You see, the method transformedValue:(id)value
receives value as id
but I need a CMTime
. I cannot simply cast it.
Also, when I create an instance of this entity, in theory I should be able to assign the value as this:
myEntity.tempo = myCmTimeValue;
and I am not seeing how I can do that to an id
...
also, on reverseTransformedValue:
I am returning an id
.
I do not understand that. I want to be able to set and receive a CMTime
CMTime
is a struct and NSValueTransformer
can only be used with objects (pointers).
A workaround is to wrap CMTime
in NSValue
@property (nonatomic, retain) NSValue *tempo;
and convert NSValue
to CMTime
and vice versa
CMTime time = [self.tempo CMTimeValue];
self.tempo = [NSValue valueWithCMTime:time];