如何从NSPersistentStoreDidImportUbiquitousChangesNotification获取插入和更新的对象?

时间:2013-11-21 14:40:22

标签: ios objective-c core-data icloud

我希望从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< ---这是类的名称,而不是我想要的对象!

1 个答案:

答案 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 可能不会更改密钥名称,但它们可以,因此使用密钥名称而不是字符串文字是更好的选择。