gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:23:22 40 4
gpt4 key购买 nike

我正在尝试使用 Core Data NSValueTransformerNSArray 转换为 NSString。不知道能不能存档,但是看到apple的官方文档有一段代码:

@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];
}

!!!注意这里

但我想知道这是否是一种正确的方法?如您所见,我在transformedValueClass方法中返回了[NSArray class],但实际上在transformedValue:<中返回了NSData类型的数据值:/.

苹果文档说:

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/

40 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com