我正在尝试使用核心数据NSValueTransformer
改造NSArray
至NSString
。我不确定是否可以存档,但我看到苹果的官方文档显示了一个代码片段:
@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'
有什么想法吗?请!!
编辑:
好吧,我只是变换NSArray
至NSData
,如果是 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
方法,但实际上返回 NSData
在 transformedValue:
中键入数据值.
苹果文档说:
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/