dar*_*nde 6 core-data nscoder ios
我需要跨设备传输单个对象.现在我正在将我的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];
}
Run Code Online (Sandbox Code Playgroud)
上面代码的问题是.它在崩溃self.title的initWithCoder说法发送到实例无法识别选择.
title不被识别为选择器.initWithCoder吗?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;
}
Run Code Online (Sandbox Code Playgroud)
上面的代码片段只处理属性,没有关系.人际关系处理的NSManagedObjectID使用NSCoding是可怕的.如果您确实需要考虑引入一个额外的属性以在解码时匹配两个(或许多)实体.
<YourContext>(基于Sam Soffes现在不可用的帖子,代码取自https://gist.github.com/soffes/317794#file-ssmanagedobject-m)
+ (NSManagedObjectContext *)mainContext {
AppDelegate *appDelegate = [AppDelegate sharedAppDelegate];
return [appDelegate managedObjectContext];
}
Run Code Online (Sandbox Code Playgroud)
注意:<YourContext>在第一个代码段中替换为mainContext
| 归档时间: |
|
| 查看次数: |
3394 次 |
| 最近记录: |