gpt4 book ai didi

ios - NSManagedObject 能否符合 NSCoding

转载 作者:可可西里 更新时间:2023-11-01 03:43:41 34 4
gpt4 key购买 nike

我需要跨设备传输单个对象。现在我正在将我的 NSManagedObject 转换为字典,将其存档并作为 NSData 发送。收到后,我正在取消存档。但我真的很想通过归档和取消归档而不是创建中间数据对象来传输 NSManagedObject 本身。

@interface Test : NSManagedObject<NSCoding>
@property (nonatomic, retain) NSString * title;
@end

@implementation Test
@dynamic title;

- (id)initWithCoder:(NSCoder *)coder {
self = [super init];
if (self) {
self.title = [coder decodeObjectForKey:@"title"]; //<CRASH
}
return self;
}
- (void)encodeWithCoder:(NSCoder *)coder {
[coder encodeObject:self.title forKey:@"title"];
}
@end


NSData *archivedObjects = [NSKeyedArchiver archivedDataWithRootObject:testObj];
NSData *objectsData = archivedObjects;
if ([objectsData length] > 0) {
NSArray *objects = [NSKeyedUnarchiver unarchiveObjectWithData:objectsData];
}

上面代码的问题是。它在 initWithCoder 中的 self.title 崩溃,说无法识别的选择器已发送到实例。

  • 为什么 title 没有被识别为选择器。
  • 是否应该在 initWithCoder 中创建对象之前以某种方式使用 nil 托管对象上下文?
  • 我是否需要覆盖 copyWithZone

最佳答案

下面的这段代码应该可以解决问题。主要区别在于调用 super initWithEntity:insertIntoManagedObjectContext:

- (id)initWithCoder:(NSCoder *)aDecoder {
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Test" inManagedObjectContext:<YourContext>];

self = [super initWithEntity:entity insertIntoManagedObjectContext:nil];
NSArray * attributeNameArray = [[NSArray alloc] initWithArray:self.entity.attributesByName.allKeys];

for (NSString * attributeName in attributeNameArray) {
[self setValue:[aDecoder decodeObjectForKey:attributeName] forKey:attributeName];
}
return self;
}

以上片段将只处理属性,不处理关系。处理关系为 NSManagedObjectID使用 NSCoding太可怕了。如果您确实需要引入关系,请考虑在解码时引入一个额外的属性来匹配两个(或多个)实体。

如何获取<YourContext>

(基于 Sam Soffes 现在不可用的帖子,代码取自 https://gist.github.com/soffes/317794#file-ssmanagedobject-m)

+ (NSManagedObjectContext *)mainContext {
AppDelegate *appDelegate = [AppDelegate sharedAppDelegate];
return [appDelegate managedObjectContext];
}

注意:替换<YourContext>在带有 mainContext 的第一个片段中

关于ios - NSManagedObject 能否符合 NSCoding,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16441587/

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