iphone - 通过 NSValueTransformer 将字符串转换为核心数据

标签 iphone ios cocoa-touch core-data

我正在尝试使用核心数据NSValueTransformer改造NSArrayNSString 。我不确定是否可以存档,但我看到苹果的官方文档显示了一个代码片段:

@interface ClassNameTransformer: NSValueTransformer {}
@end
@implementation ClassNameTransformer
+ (Class)transformedValueClass { return [NSString class]; }
+ (BOOL)allowsReverseTransformation { return NO; }
- (id)transformedValue:(id)value {
  return (value == nil) ? nil : NSStringFromClass([value class]);
}
@end

似乎可以将数据存储到NSString中(也许我误解了..),所以我尝试如下:

@implementation ArrayToStringTransformer

+ (BOOL)allowsReverseTransformation {
  return YES;
}

+ (Class)transformedValueClass {
  return [NSString class];
}

- (id)transformedValue:(id)value {
//  return NSStringFromClass([value class]);
//  return NSStringFromClass([@"11" class]);

  NSLog(@"!!!!!! %@, %@", NSStringFromClass([value class]), value);
  if ([value isKindOfClass:[NSString class]])
    return NSStringFromClass([value class]);

  NSMutableString * string = [NSMutableString string];
  for (NSNumber * number in value)
    [string appendString:[NSString stringWithFormat:@"%@,", number]];
  return string;
}

- (id)reverseTransformedValue:(id)value {
  NSArray * array = [value componentsSeparatedByString:@","];
  return array;
}

@end

但是,它崩溃并出现以下错误(包括 NSLog):

[26364:11903] !!!!!! __NSCFString, 0,0
[26364:11903] -[__NSCFString bytes]: unrecognized selector sent to instance 0x905f620
[26364:11903] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFString bytes]: unrecognized selector sent to instance 0x905f620'

有什么想法吗?请!!


编辑:

好吧,我只是变换NSArrayNSData ,如果是 NSString输入,将其转换为NSArray首先,然后到NSData ,并且它有效:

+ (Class)transformedValueClass {
  return [NSArray class];
}

- (id)transformedValue:(id)value {
  if (! [value isKindOfClass:[NSString class]])
    return [NSKeyedArchiver archivedDataWithRootObject:value];

  NSLog(@"!!! Convert NSString to NSArray");
  NSArray * array = [value componentsSeparatedByString:@","];
  NSData * data = [NSKeyedArchiver archivedDataWithRootObject:array];
  return data;
}

- (id)reverseTransformedValue:(id)value {
  return [NSKeyedUnarchiver unarchiveObjectWithData:value];
}

!!!注意这里

但我想知道这是否是正确的方法?正如你所看到的,我return [NSArray class]transformedValueClass方法,但实际上返回 NSDatatransformedValue: 中键入数据值.

苹果文档说:

An NSData object containing the encoded form of the object graph whose root object is rootObject

我完全困惑了......

最佳答案

目前Core Data只能转换为NSData。默认转换器可以通过将属性类型设置为可转换来处理将字符串数组转换为 NSData,这是唯一需要的配置。

我个人希望 Core Data 将来能够转换为字符串,例如,当使用 SQLite 浏览器时,记录字段是人类可读的,而不是二进制 plist。

他们可能不包含此功能的一个理论是,如果您尝试包含字符串数组,那么您可能最好使用多对多关系来实现您尝试存储的内容.

关于iphone - 通过 NSValueTransformer 将字符串转换为核心数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9344189/

相关文章:

ios - 在 UITabBarController 中选择不同的选项卡时如何添加不同颜色的下划线

iphone - 如何从 LandscapeView(iPad) 中显示纵向 View ?

iphone - 如何更改 Facebook 登录页面的语言?

ios - 异步调度队列中只有两个任务并发运行

ios - 我应该为 Pod 使用 Swift 4 迁移工具吗?

ios - 是否可以使用 iOS Developer Enterprise Program 分发使用 beta SDK 构建的内部应用程序?

ios - 如何转换到我的 UIViewController

iphone - 如何以编程方式退出 MPMoviePlayerController?

ios - 我怎样才能从一个 NSDictionary 调用 objectForKey 与一个键是 NSNumbers 的 int

iphone - 如何确定iPhone App使用什么框架?