尝试将 CMTime 存储为 Core Data 上的可转换属性

Posted

技术标签:

【中文标题】尝试将 CMTime 存储为 Core Data 上的可转换属性【英文标题】:Trying to store CMTime as Transformable property on Core Data 【发布时间】:2018-03-10 18:12:49 【问题描述】:

我之前使用过 Core Data 的可转换属性,但没有使用 C 对象,例如 CMTime

我需要使用可转换在 Core Data 上存储 CMTime

在模型对象上,我已将其声明为可变形。

@property (nonatomic, retain) id tempo;

我知道CMTime 是一个C 对象,我需要将其转换为 NSDictionary 并对其进行序列化,以便存储在 Core Data 上。

NSManagedObject 课堂上,我有这个...

+(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];

????? 是我的问题。你看,transformedValue:(id)value 方法接收的值是id,但我需要一个CMTime。我不能简单地施放它。

另外,当我创建这个实体的一个实例时,理论上我应该能够这样分配值:

myEntity.tempo = myCmTimeValue;

我不知道如何对 id 这样做...

另外,在reverseTransformedValue: 上,我将返回id

我不明白。我希望能够设置和接收CMTime

【问题讨论】:

【参考方案1】:

CMTime 是一个结构,NSValueTransformer 只能与对象(指针)一起使用。

一种解决方法是将CMTime 包装在NSValue

@property (nonatomic, retain) NSValue *tempo;

并将NSValue 转换为CMTime,反之亦然

CMTime time = [self.tempo CMTimeValue];


self.tempo = [NSValue valueWithCMTime:time];

【讨论】:

以上是关于尝试将 CMTime 存储为 Core Data 上的可转换属性的主要内容,如果未能解决你的问题,请参考以下文章

以 Core Data 为数据源的 QLPreviewController

在 Core Data 中保存 UIImage 的最佳方法

Xcode 6- SWIFT- 将 CMTime 转换为浮点数

在 Swift Core Data 中对存储的数据模型提取进行排序

如何将 NSMutableString 转换为 double 以存储在 Core Data 中?

将 NSNumber* 的 NSArray 存储为 Core Data 中的 NSString