ios – NSManagedObject是否符合NSCoding

ios – NSManagedObject是否符合NSCoding,第1张

概述我需要跨设备传输单个对象.现在我正在将我的NSManagedObject转换为字典,将其存档并作为NSData发送.收到后,我正在取消归档.但我真的想通过归档和取消归档来转移NSManagedObject本身,而不是创建一个中间数据对象. @interface Test : NSManagedObject<NSCoding>@property (nonatomic, retain) NSStri 我需要跨设备传输单个对象.现在我正在将我的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"];}@endNSData *archivedobjects = [NSKeyedArchiver archivedDataWithRootObject:testObj];NSData *objectsData = archivedobjects;if ([objectsData length] > 0) {    NSArray *objects = [NSKeyedUnarchiver unarchiveObjectWithData:objectsData];}

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

>为什么标题不被识别为选择器.
>在initWithCoder中创建对象之前,unarchive应该以某种方式使用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;}

上面的代码片段只处理属性,没有关系.使用NSCoding处理NSManagedobjectID之间的关系非常糟糕.如果您确实需要考虑引入一个额外的属性以在解码时匹配两个(或许多)实体.

如何获得< 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全部内容,希望文章能够帮你解决ios – NSManagedObject是否符合NSCoding所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1114455.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-29
下一篇 2022-05-29

发表评论

登录后才能评论

评论列表(0条)

保存