2013-01-07 52 views
3

我在nil託管對象上下文中創建NSManagedObject的實例,因爲我不想保存對象,除非用戶稍後選擇。NSManagedObject上的屬性爲空

我這樣做是通過創建具有上下文的實體描述,然後在沒有上下文的情況下創建對象本身。如下所示。

NZVideo *video = nil; 
if ([[tempVideo objectForKey:_kResponseVideoTypeKey] isEqualToString:_kVideoTypeYouTube] == YES) 
{ 
    NSEntityDescription *entityDescription = [NZYouTubeVideo entityDescriptionInContext:[NSManagedObjectContext contextForCurrentThread]]; 
    video = (NZVideo *)[[NSManagedObject alloc] initWithEntity:entityDescription insertIntoManagedObjectContext:nil]; 
    [(NZYouTubeVideo *)video setVideoId:[media objectForKey:_kResponseVideoIdKey]]; 
} 
else if ([[tempVideo objectForKey:_kResponseVideoTypeKey] isEqualToString:_kVideoTypeS3] == YES) 
{ 
    NSEntityDescription *entityDescription = [NZS3Video entityDescriptionInContext:[NSManagedObjectContext contextForCurrentThread]]; 
    video = (NZVideo *)[[NSManagedObject alloc] initWithEntity:entityDescription insertIntoManagedObjectContext:nil]; 
    [(NZS3Video *)video setAbsoluteVideoUrl:[media objectForKey:_kResponseVideoUrlKey]]; 
} 

[video setTitle:title]; 
[video setSummary:summary]; 
[video setDurationValue:duration]; 

if (tempThumbnails != nil) 
{ 
    NSString *smallThumbnail = [tempThumbnails objectForKey:_kResponseVideoThumbnailSmallKey]; 

    if (smallThumbnail != nil) 
    { 
     NSEntityDescription *entityDescription = [NZThumbnail entityDescriptionInContext:[NSManagedObjectContext contextForCurrentThread]]; 
     NZThumbnail *thumbnail = (NZThumbnail *)[[NSManagedObject alloc] initWithEntity:entityDescription insertIntoManagedObjectContext:nil]; 
     [thumbnail setAbsoluteImageUrl:smallThumbnail]; 
     [thumbnail setAbsoluteSizeValue:NZThumbnailSizeSmall]; 
     [video addThumbnailsObject:thumbnail]; 
    } 
} 

if (video != nil) 
{ 
    [videos addObject:video]; 
} 

然後,當我想保存對象時,我將它們添加到託管對象上下文中。我還添加了該對象與之有關係的所有對象。

[MagicalRecord saveUsingCurrentThreadContextWithBlock:^(NSManagedObjectContext *context) { 
    id _video = nil; 
    if ([video isKindOfClass:[NZYouTubeVideo class]]) 
    { 
     _video = (NZYouTubeVideo *)video; 
    } 
    else if ([video isKindOfClass:[NZS3Video class]]) 
    { 
     _video = (NZS3Video *)video; 
    } 

    if (((NSManagedObject *)_video).managedObjectContext == nil) 
    { 
     [context insertObject:_video]; 
    } 

    for (NZThumbnail *thumbnail in ((NZVideo *)_video).thumbnails) 
    { 
     [context insertObject:thumbnail]; 
    } 

    [playlist addVideosObject:video]; 
} 
completion:^(BOOL success, NSError *error) { 
    if (error != nil) 
    { 
     DDLogVerbose(@"%@", error); 
    } 
}]; 

然而,在重新啓動應用程序時,該物體已經被添加到核心數據,但所有的對象的屬性是null

有誰知道爲什麼會發生這種情況,以及如何讓它存儲屬性?如上所述,物體存在。他們被堅持,但所有的屬性都是空的。

我不認爲它有任何區別,但我使用MagicalRecord來創建,保存和檢索實體。

回答

3

不要這樣做。我以前:-)

已經回答了這個同樣的問題,您應該:

保存所有所需的值和變量,然後當用戶按下「保存」創建並插入管理對象和保存環境。

或者:

創建和插入對象插入上下文。保持對該對象的引用並在用戶輸入信息時更新它們。如果用戶按下保存然後保存上下文。如果用戶按取消,則只需刪除該對象。

如果不將其插入到上下文中,則不應創建管理對象。它沒有任何意義。

看到這個答案也iPhone Core Data: Initializing Managed Object without a context

+1

你說得對。唯一真正的解決方案是不這樣做:-)這不是如何使用核心數據,因此應該預料到意想不到的結果。 – simonbs

+0

同意。儘管我使用默認的NSConfinementConcurrencyType在臨時對象中使用默認的NSConfinementConcurrencyType處理應用程序中的臨時對象,但一旦我開始使用主隊列和專用隊列,事情就會崩潰。 – stevesliva

+0

此外,nil屬性可能與awakeFromInsert跳過您創建的不包含上下文的對象有關。 – stevesliva