Должен ли я получить все объекты Core Data заранее на iPhone? - PullRequest
3 голосов
/ 03 сентября 2010

Я создаю социальное приложение, в котором есть chatView. Сообщение является сущностью. На usersViewController (rootViewController) я хочу просто отобразить количество непрочитанных сообщений от каждого пользователя. Но в ChatView я хочу показать сообщения, отправленные между мной и выбранным пользователем.

Как мне получить сообщения из Core Data?

  1. Есть ли способ извлечь их все в NSMutableDictionary с userIds в качестве ключей, каждый из которых указывает на NSMutableArray сущностей Message? Или я должен был бы получить все Сообщения и затем просмотреть их с помощью Objective-C, чтобы расположить их, как описано?

  2. В любом случае, я должен загрузить их все заранее в appDelegate? Или я должен загружать сообщения только для определенного разговора при просмотре соответствующего chatView?

  3. Чтобы получить непрочитанные значения, должен ли я выполнить итерацию по извлеченным сущностям сообщения, чтобы создать NSMutableDictionary ключей userID, указывающих на значения счетчиков? Или я должен сделать предикат, который действует как запрос суммы SQL, сгруппированный по userId (возможно ли это даже с Core Data?)?

  4. Должен ли я создать модель, назовите ее UnreadMessageCount, которая хранит количество непрочитанных сообщений от каждого пользователя и ссылку на модель User? Я хочу, чтобы все непрочитанные сообщения были на первой странице приложения, чтобы этот запрос ускорился. Но получение сообщений будет медленнее, потому что мне нужно будет не только добавить его в модель сообщений, но и увеличить счетчик для этого пользователя в модели UnreadMessageCount. Кроме того, данные будут как бы дублированы. Кроме того, я сделаю запрос для всех сообщений только один раз за запуск приложения, но я сделаю запросы, чтобы обновить количество непрочитанных сообщений каждый раз, когда я получаю новое сообщение и не нахожусь на странице chatView с этим пользователем.

Пожалуйста, напишите мне об управлении памятью iPhone и возможностях и производительности Core Data. А также, пожалуйста, выскажите свое мнение о том, как лучше это сконструировать.

Спасибо!

Мэтт

Ответы [ 2 ]

3 голосов
/ 03 сентября 2010

Чтобы получить количество сообщений, я бы попросил контекст управляемого объекта для подсчета сообщений, переданных определенным запросом на выборку, например, для подсчета сообщений для определенного пользователя:

NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Message" inManagedObjectContext:context];
[request setEntity:entity];

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"user == %@", user];
[request setPredicate:predicate];

NSInteger count = [context countForFetchRequest:request error:nil];

Здесь яЯ предполагаю, что сущность Message имеет отношение user.

Чтобы получить фактические сообщения для того же пользователя, я просто заменил бы последнюю строку для:

NSArray *messages = [context executeFetchRequest:request error:nil];
0 голосов
/ 03 сентября 2010

iPhone обычно отлично справляется с управлением ресурсами, когда вы используете CoreData (особенно простые структуры, как в вашем примере). Поэтому, чтобы ответить на ваши вопросы, я думаю, вам следует сделать следующее:

  1. Вам нужно будет выбрать всех пользователей, затем выполнить итерацию по ним и создать словарные ключи, которые будут указывать на messages свойство каждого из user объектов
  2. Не следует использовать NSFetchedResultsController, вместо этого он эффективно загружает запрошенные объекты и выполняет всю необходимую предварительную выборку для оптимизированного отображения в табличных представлениях
  3. ответ, приведенный выше, - это, вероятно, путь, когда дело доходит до подсчета. Создание правильных индексов на ваших сущностях сделает его молниеносным.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...