사용자가 나중에 선택하지 않는 한 객체를 저장하지 않으려는 목적으로 관리되는 객체 컨텍스트없이 NSManagedObject의 인스턴스를 만듭니다.NSManagedObject의 등록 정보가 null입니다.
컨텍스트가있는 엔터티 설명을 만든 다음 컨텍스트없이 개체 자체를 만드는 방법으로이 작업을 수행합니다. 아래에 그 예가 나와 있습니다.
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
이다.
왜 이런 일이 발생하고 어떻게 속성을 저장할 수 있는지 아는 사람이 있습니까? 말했듯이, 물체가 존재합니다. 속성은 유지되지만 모든 속성은 null입니다.
나는 어떤 차이가 있다고 생각하지 않지만 엔티티를 생성, 저장 및 검색하려면 MagicalRecord을 사용합니다.
당신 말이 맞습니다. 유일한 실제 해결책은 이렇게하지 않는 것입니다 :-) 이것은 Core Data가 사용되는 방식이 아니므로 예기치 않은 결과가 실제로 예상됩니다. – simonbs
동의 함. 기본 NSConfinementConcurrencyType을 사용하는 하나의 컨텍스트가있는 응용 프로그램에서 nil 컨텍스트의 임시 객체를 사용하고 있지만 주 및 비공개 대기열을 사용하자마자 문제가 발생했습니다. – stevesliva
또한 nil 속성은 컨텍스트없이 객체를 만들 때 건너 뛴 awakeFromInsert와 관련이있을 수 있습니다. – stevesliva