将托管对象转换为数据对象

时间:2014-11-25 05:41:18

标签: ios core-data

如何将NSManagedObject转换为NSData对象?

我是Core Data和Multipeer Connectivity Framework的新手。

我需要通过Multipeer Connectivity Framework在两台设备之间传输数据。我知道我不能简单地通过MPC传输,因为它需要一个NSData对象。

是否有任何提供此类功能的第三方库?

3 个答案:

答案 0 :(得分:2)

我认为NSCoding在这里不是一个好主意。原因是两个不同设备上的对象由于其内部托管对象ID以及意外同步方案中可能出现的大量其他可能问题而不会相同。

我强烈建议您解决问题并将对象转换为NSDictionary类型,然后在字典(或字典数组)上使用标准NSData API。

答案 1 :(得分:0)

试试这样 您应该使用NSCoding协议,然后您可以将对象编码为NSData。再次如果要解码原始对象,请使用NSKeyedUnarchiver。

in .h

@interface Testting : NSManagedObject<NSCoding>

这是在.m

  NSData *data=[NSKeyedArchiver archivedDataWithRootObject:hereyourObject];

//获取原始对象

Testting *Obj = [NSKeyedUnarchiver unarchiveObjectWithData:data];

答案 2 :(得分:0)

您应该使用NSCoding协议。使用NSKeyedAchiever,您可以将对象编码为NSData。再次如果要解码原始对象,请使用NSKeyedUnarchiver。

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

@implementation Test
@dynamic title;

- (id)initWithCoder:(NSCoder *)coder {
    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;
}

- (void)encodeWithCoder:(NSCoder *)coder {
    [coder encodeObject:self.title forKey:@"title"];
}
@end

//converting to NSData
NSData *archivedObject = [NSKeyedArchiver archivedDataWithRootObject:testObj];

//get your original object
Test *testObj = [NSKeyedUnarchiver unarchiveObjectWithData:archivedObject];