2013-05-11 3 views
1

Невозможно понять, как получить атрибут из отношения при ограничении выборки до нескольких свойств. В приведенном ниже коде «thumbnail» является трансформируемым атрибутом UIImage объекта «Фотография». Это всегда возвращается в массив словарей с ключевым «миниатюром». То, что я не могу понять, - это второе свойство/атрибут, где «previewImage» является отношением в Фото к другому объекту с именем «Изображение», который имеет изменяемый атрибут «uiImage» (который является UIImage).Основные данные: атрибуты привязки отношений

Я попытался это:

[fetchRequest setPropertiesToFetch:@[@"thumbnail", @"previewImage.uiImage"]]; 

, но я получил эту ошибку:

-[NSExpressionDescription valueTransformerName]: unrecognized selector sent to instance 0x13078920 

и я попытался это:

[fetchRequest setPropertiesToFetch:@[@"thumbnail", @"previewImage"]]; 

, где я получаю два пункта в каждом словаре

{ 
    previewImage = "0xbabba90 <x-coredata://03FF7129-1345-4BAE-A74E-2FF5A2B38CDC/Image/p5>"; 
    thumbnail = "<UIImage: 0xbabbc60>"; 
} 

, но когда я пытаюсь использовать, что «изображение» объекта, как показано ниже

NSDictionary *dict = [self.photos objectAtIndex:0]; 
Image *theImage = (Image *)[dict objectForKey:@"previewImage"]; 
[self.delegate photoCollectionViewController:self didSelectPreviewImage:theImage.uiImage]; 

Я получаю эту ошибку

"[_NSObjectID_48_0 uiImage]: unrecognized selector sent to instance 0xbabba90" 

И я даже бросил это в запросе

[fetchRequest setRelationshipKeyPathsForPrefetching:@[@"previewImage.uiImage"]]; 

Итак, я думаю, что я размахиваю и не понимаю. Любая помощь будет оценена по достоинству. Благодаря!

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Photo" inManagedObjectContext:self.managedObjectContext]; 
[fetchRequest setEntity:entity]; 
[fetchRequest setResultType:NSDictionaryResultType]; 
+0

Ссылка на '_NSObjectID_48_0' предполагает, что вы использовали' NSManagedObjectIDResultType' где-то, хотя ваш код говорит 'NSDictionaryResultType'. Вы спрашивали где-нибудь идентификаторы объектов? –

+0

Нет. Я искал весь проект для «NSManagedObjectIDResultType» и ничего там не было. Я даже не знал, что вы можете изменить тип результата, пока я не попытался ограничить выбранные свойства :) BTW, у меня есть ваша книга;) – user1139479

ответ

1

С помощью NSDictionaryResultType вы можете удобно получить свойства объекта. Он не предназначен для общения. Вот почему вы получаете сообщение об ошибке, когда делаете то, что было бы логично: извлечь previewImage.uiImage.

Из документов:

The property descriptions may represent attributes, to-one relationships, or expressions.

Может быть, вы все еще думаете в терминах запроса к базе данных, где выборочно выбрать «поля», чтобы принести. Это не обязательно в Core Data, который является графиком объектов , а не базой данных.

Вместо этого просто введите NSManagedObject. Если вас беспокоит память, вы не должны быть. В основных данных используется механизм, называемый с ошибкой, чтобы извлечь только то, что ему нужно. Действительно, приведенный выше критический текст "<x-coredata://03FF7129-1345-4BAE-A74E-2FF5A2B38CDC/Image/p5>" довольно похож на то, как отображается ошибка в консоли.

Попробуйте сделать выборку с помощью обычных объектов. Вы можете ожидать, что он «просто работает».

+0

Да, я вернулся к «старому» способу.Я пытался быть слишком «умным», потому что у меня были некоторые атрибуты на Фото, такие как NSData для изображения, которое я не хотел получать или ошибочно (и на самом деле это причина, по которой у меня есть uiImage в другой сущности). Итак, остальные атрибуты для фото теперь легкие. НО, я все еще хотел бы знать, как это сделать :) – user1139479

+0

Вы можете это сделать, но вам нужно использовать ** 2 ** выборки. Я думаю, должно быть очевидно, как это сделать. См. Мое редактирование ответа, чтобы объяснить, почему вы не можете сделать это в одном. – Mundi

+0

Тем не менее, вы должны отметить правильный ответ. – Mundi

Смежные вопросы