2013-11-21 67 views
0

我想從NSPersistentStoreDidImportUbiquitousChangesNotification中獲取插入的和更新對象來對它們進行一些檢查。如何從NSPersistentStoreDidImportUbiquitousChangesNotification獲取插入和更新的對象?

對象可以是2種類:「阿爾法」和「貝塔」。這兩個類都有

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 < - 這是班級的名字,而不是我想要的對象!

beta = Beta < ---它是類的名稱,而不是我想要的對象!

回答

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... 
} 

如果我自己沒有託管對象上下文,則可能需要更改。

此外,有輕微的tangent--它通常最好使用NSInsertedObjectsKey而不是@"inserted"NSUpdatedObjectsKey而不是@"updated"。 Apple 可能不會更改密鑰名稱,但它們可以,因此使用密鑰名稱而不是字符串文字是更好的選擇。