Codable似乎是一个非常令人兴奋的功能.但我想知道我们如何在核心数据中使用它?特别是,是否可以直接从/向NSManagedObject编码/解码JSON?
我尝试了一个非常简单的例子:
并定义Foo自己:
import CoreData
@objc(Foo)
public class Foo: NSManagedObject, Codable {}
Run Code Online (Sandbox Code Playgroud)
但是当它像这样使用时:
let json = """
{
"name": "foo",
"bars": [{
"name": "bar1",
}], [{
"name": "bar2"
}]
}
""".data(using: .utf8)!
let decoder = JSONDecoder()
let foo = try! decoder.decode(Foo.self, from: json)
print(foo)
Run Code Online (Sandbox Code Playgroud)
编译器因此错误而失败:
super.init isn't called on all paths before returning from initializer
Run Code Online (Sandbox Code Playgroud)
目标文件是定义的文件 Foo
我想我可能做错了,因为我甚至没有通过NSManagedObjectContext,但我不知道在哪里坚持下去.
核心数据是否支持Codable?
我一直在寻找一篇文章,解释NSCoding(NSKeyedArchiver ...)使用CoreData(SQLite ....)的优缺点.
有很多的选择,我可以实现自己的自定义二进制读/写器,或使用的Plist/XML/JSON ...或使用SQLite或NSCoding.
我现在有点迷失了.任何机构都可以解释MAIN功能之间的区别吗?
我有一个核心数据应用程序,具有相当简单的数据模型.我希望能够将NSImage的实例作为PNG位图NSData对象存储在持久存储中,以节省空间.
为此,我编写了一个简单的NSValueTransformer,将NSImage转换为PNG位图格式的NSData.我在我的App委托中使用此代码注册值转换器:
+ (void)initialize
{
[NSValueTransformer setValueTransformer:[[PNGDataValueTransformer alloc] init] forName:@"PNGDataValueTransformer"];
}
Run Code Online (Sandbox Code Playgroud)
在我的数据模型中,我将image属性设置为Transformable,并指定PNGDataValueTransformer为值转换器名称.
但是,我的自定义值转换器未被使用.我知道这一点,因为我已将日志消息放入我的值转换器-transformedValue:和-reverseTransformedValue未记录的方法中,并且保存到磁盘的数据只是一个存档的NSImage,而不是它应该是的PNG NSData对象.
为什么这不起作用?
这是我的价值转换器的代码:
@implementation PNGDataValueTransformer
+ (Class)transformedValueClass
{
return [NSImage class];
}
+ (BOOL)allowsReverseTransformation
{
return YES;
}
- (id)transformedValue:(id)value
{
if (value == nil) return nil;
if(NSIsControllerMarker(value))
return value;
//check if the value is NSData
if(![value isKindOfClass:[NSData class]])
{
[NSException raise:NSInternalInconsistencyException format:@"Value (%@) is not an NSData instance", [value class]];
}
return [[[NSImage alloc] initWithData:value] autorelease];
}
- (id)reverseTransformedValue:(id)value;
{ …Run Code Online (Sandbox Code Playgroud)