отобразить DetailsViewController с помощью NSFetchedResultController

В моем приложении для iphone у меня есть тема отношения основных данных ко многим - >> вопрос, поэтому каждая тема содержит несколько вопросов, я понял, как отображать список тем в UItableView с помощью NSFetchedResultController, но я не могу понять, как мне построить мой FetchedResultController для отображения вопросов в выбранной теме.

Я пытаюсь найти в Интернете аналогичный учебник или пример, но ничего не могу найти.

Как мне это сделать?

Большое Вам спасибо


person Burjua    schedule 18.08.2010    source источник


Ответы (3)


Вам НЕ нужно возвращаться к NSFetchRequest, чтобы получить объекты на другом конце отношения. Просто задайте вопросы своему Topic. Это даст вам NSSet неисправных объектов. Сбойные объекты занимают ОЧЕНЬ мало памяти, и вы можете легко извлечь 1000 из них.

Если вам нужно их отфильтровать, вы можете выполнить -filteredSetWithPredicate: на возвращаемом NSSet, но выход на диск будет расточительным и медленным.

person Marcus S. Zarra    schedule 18.08.2010
comment
Хорошо, спасибо Маркус, в моем rootViewcontroller мне также нужно добавить что-то вроде ячейки All themes и, соответственно, отобразить список всех вопросов в detailsView. Есть ли какой-нибудь простой способ сделать это с малым объемом памяти? - person Burjua; 19.08.2010
comment
Памяти будет настолько мало, насколько вы рассчитываете. Пока вы помещаете все вопросы в NSFetchedResultsController в этом случае, Core Data должен поддерживать низкий уровень памяти. Однако в этом случае я предлагаю попробовать и посмотреть, что произойдет. Предварительное предположение о проблемах с памятью похоже на предварительную оптимизацию; верная трата времени. - person Marcus S. Zarra; 19.08.2010
comment
Извините, я не понял, если вы предлагаете мне не использовать другой NSFetchedResultController, а вместо этого использовать NSSet, как я могу получить набор всех вопросов? Благодарность - person Burjua; 19.08.2010
comment
У ваших объектов есть отношения. Когда пользователь нажимает на строку, вы получаете тему, связанную с этой строкой. Вы передаете эту тему следующему UIViewController и помещаете ее в стек навигации. Затем вы задаете в этой теме, возможно, через [topic valueForKey: @questions] NSSet вопросов, которые будут отображаться в соответствующем представлении. - person Marcus S. Zarra; 20.08.2010
comment
Извините, если я не совсем понял, но мне нужно получить список (набор) всех вопросов по всем темам, возможно ли это? - person Burjua; 20.08.2010
comment
Для этого вам нужно использовать NSFetchedResultsController и обрабатывать его отдельно / иначе, чем строки, для которых выбран Topic. Мои ответы были нацелены на ваш исходный вопрос, в котором выбрана Topic сущность. Я бы предложил создавать новые вопросы SO, когда у вас есть другой вопрос. Помогает с ясностью. - person Marcus S. Zarra; 20.08.2010

Вы не будете использовать NSFetchedResultsController. Вместо этого вы определите свойство в своем контроллере детального представления.

@property (nonatomic, retain) Topic *topic;

Затем, когда вы создаете свой контроллер подробного представления, вы устанавливаете свойство на основе темы, выбранной в didSelectRowForIndexPath.

Затем в вашем подробном представлении это просто вопрос извлечения вопросов из объекта Тема, используя взаимосвязь основных данных (topic.questions).

person DVG    schedule 18.08.2010
comment
Спасибо за ответ, я как бы подумал об этом, но если моя тема содержит 1000 вопросов, приложение сохранит их все в памяти, не так ли? какой вообще смысл использовать NSFetchedResultsController? Я думал, что с его помощью я смогу уменьшить использование памяти. Или я что-то не так понимаю? - person Burjua; 18.08.2010
comment
кроме того, во многих вопросах здесь я видел дискуссии об использовании NSFetchedResultsController в деталяхView, например. здесь: stackoverflow. com / questions / 2931431 / или здесь: stackoverflow.com/questions/2218817/ единственная проблема - нет объяснения, как это сделать (( - person Burjua; 18.08.2010
comment
Свойство не требуется, вы можете использовать KVC для доступа к взаимосвязи без необходимости создания подклассов. - person Marcus S. Zarra; 18.08.2010

Хорошо, я обнаружил, что мне нужно использовать для этого NSPredicate. Теперь я пытаюсь добавить его в свой fetchedResultController следующим образом:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"topic == %@", self.topic];
[fetchRequest setPredicate:predicate];

но появляется ошибка:

'keypath topic not found in entity <NSSQLEntity QuestionItem id=2>'

Как мне это сделать?

Спасибо

Изменить

Понятно!

необходимо настроить обе стороны отношения в модели данных и установить предикат следующим образом:

[NSPredicate predicateWithFormat:@"topic.topicName == %@", self.topic]

person Burjua    schedule 18.08.2010