我在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來創建,保存和檢索實體。
你說得對。唯一真正的解決方案是不這樣做:-)這不是如何使用核心數據,因此應該預料到意想不到的結果。 – simonbs
同意。儘管我使用默認的NSConfinementConcurrencyType在臨時對象中使用默認的NSConfinementConcurrencyType處理應用程序中的臨時對象,但一旦我開始使用主隊列和專用隊列,事情就會崩潰。 – stevesliva
此外,nil屬性可能與awakeFromInsert跳過您創建的不包含上下文的對象有關。 – stevesliva