ios - NSManagedObject 能否符合 NSCoding

标签 ios core-data nscoder

我需要跨设备传输单个对象。现在我正在将我的 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/

相关文章:

ios - 如何在 UITableViewCell 中创建信息按钮?

objective-c - 如何将获取的对象保存到核心数据

ios - UIImageView动画后如何清理内存

ios - Objective-C - 图像处理 - 修复 Blob 画笔

ios - 在 UIWebView 上设置强 NSBlockOperation。这是一个坏主意吗?

objective-c - Mac OSX 应用程序 : Issue Related to NSArrayController NSTableView Core data Adding Record

ios - 在进行许多计划更改的开发时使用核心数据

ios - 具有其他自定义类变量的自定义对象的 NSUserDefaults

swift - SKSpriteNode 在 init(NSCoder) 中设置颜色

swift - NSCoder 无法解码 Float