我希望从NSPersistentStoreDidImportUbiquitousChangesNotification
获取插入和更新对象以对它们进行检查。
对象可以是两种类:“ Alpha ”和“ Beta ”。
这两个类都有property (nonatomic, retain) NSString* name
这是我应该检查的那个。
我如何得到它?
以下代码不起作用,因为它说“name”是一个未知的选择器:
-(void) checkObjects
{
NSDictionary *insertedObjects = [[note userInfo] objectForKey: @"inserted"];
NSDictionary *updatedObjects = [[note userInfo] objectForKey: @"updated"];
for(NSManagedObject *obj in insertedObjects){
if([obj.entity.managedObjectClassName isEqualToString:@"Alpha"]){
Alpha *alpha = (Alpha*) obj;
if (alpha.name isEqualToString:@"xyz"){
//Do some check
}
}else if([obj.entity.managedObjectClassName isEqualToString:@"Beta"]){
Beta *beta = (Beta*) obj;
if (beta.name isEqualToString:@"xyz"){
//Do some check
}
}
}
}
如果我改变:
Alpha *alpha = (Alpha*) obj;
Beta *beta = (Beta*) obj;
要:
Alpha *alpha = (Alpha*) obj.entity;
Beta *beta = (Beta*) obj.entity;
alpha = Alpha< - 这是类的名称,而不是我想要的对象!
beta = Beta< ---这是类的名称,而不是我想要的对象!
答案 0 :(得分:4)
当您获得NSPersistentStoreDidImportUbiquitousContentChangesNotification
时,userInfo
中的对象不是托管对象,它们是托管对象ID。也就是NSManagedObjectID
的实例。如果要在托管对象上查找属性,则需要获取与ID对应的对象。像
NSDictionary *insertedObjectIDs = [[note userInfo] objectForKey:NSInsertedObjectsKey];
for(NSManagedObjectID *objID in insertedObjects) {
NSError *error = nil;
NSManagedObject *obj = [self.managedObjectContext existingObjectWithID:objID error:&error];
....continue...
}
如果self没有托管对象上下文,您可能需要更改它。
此外,在略微切线上 - 通常最好使用NSInsertedObjectsKey
代替@"inserted"
和NSUpdatedObjectsKey
而不是@"updated"
。 Apple 可能不会更改密钥名称,但它们可以,因此使用密钥名称而不是字符串文字是更好的选择。