我在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