Имея приложение, которое делает то же самое, вот мои идеи.
Прежде всего, вы должны продумать coredata и многопоточность, прежде чем кодировать.Если вам нужна помощь, дайте мне знать.
Модель
Вы работаете с сущностями в Coredata, которые можно рассматривать как таблицы в sqlite, но более абстрактно.Для этого вам следует просмотреть документацию Apple .
В вашем случае мы можем найти как минимум три различных объекта: Пользователь, Разговор и Сообщение.(будьте осторожны с последним, у меня возникла проблема с сущностью под названием Message при импорте SMS Framework, вы должны рассмотреть вопрос о добавлении префикса имени сущности ..)
Проблема с coredata заключается в том, что вы не можетехранить напрямую массивы (может быть с неизвестным типом), но в любом случае.Итак, два решения для хранения ваших пользователей: либо в строке NSSt, когда они будут разделены запятыми, и простое регулярное выражение или разделение даст вам количество пользователей ..
, чтобы ваша модель могла выглядеть так:
Conversation{
messages<-->>Message.conversation
lastMessage<-->Message.whateverName
//optional
users<<-->>User.conversation
}
Message{
conversation<<-->Conversation.messages
whatevername<-->Conversation.lastmessage // "whatever as it does not really matter"
}
User{
conversations<<-->>Conversation.users
}
Разговор должен иметь отношение «ко-многим» с «Сообщением», а «Сообщение» - отношение «один к одному» с «Разговором».
- РЕДАКТИРОВАТЬ
Если вы хотитечтобы отобразить последнее сообщение разговора, как сообщение «Приложение» (или мое приложение), вы можете добавить одну связь с сообщением.Это не будет хранить сообщение дважды в базе данных / coredata.Действительно, вы создаете объект coredata (в данном случае сообщение) и добавляете его в диалог, что происходит в том, что диалог сохраняет идентификатор coredata для этого объекта.Добавление одного отношения для этого сообщения (lastMessage) будет хранить только другой идентификатор, а не другой объект.
- конец EDIT
Пользователи немного отличаются, потому что они могут быть частью нескольких бесед (из-за групповой беседы), поэтому вам нужно многоОтношение ко многим.
Вы можете добавить столько атрибутов, сколько хотите, но это минимальное требование!
- Реализация
тогда в вашемкод, если вы хотите имитировать поведение iMessage, вот что я сделал:
в первом контроллере, где вы можете увидеть весь диалог: используйте NSFetchedResultController.Запрос должен касаться только сущности Conversation.
При нажатии на строку я сделал следующее: у нового представления есть объект диалога и другой NSFtechedResultController.Затем я запрашиваю только сообщение сущности, но с предикатом, указывающим, что я хочу только эту беседу.
Если вы хотите проверить мое приложение, чтобы увидеть текучесть, перейдите по этой ссылке.
РЕДАКТИРОВАТЬ
- Фрагмент кода, чтобы найти последнее сообщение разговора
Осторожно: это временный ответ переднайти лучший способ сделать это (например, при использовании извлеченных свойств)
NSFetchRequest * req = [[NSFetchRequest alloc] init];
[req setEntity:[NSEntityDescription entityForName:@"Message" inManagedObjectContext:context]];
[req setPredicate:[NSPredicate predicateWithFormat:@"conversation == %@", self]]; /* did that from a Conversation object.. */
NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"sent_date" ascending:NO];
[req setSortDescriptors:[NSArray arrayWithObject:sort]];
[sort release];
NSError * error = nil;
NSArray * messages = [context executeFetchRequest:req error:&error];
[req release];
if ([messages count] > 0) { /* sanity check */
return [messages objectAtIndex:0];
}
return nil;
- конец EDIT
Надеюсь, эта помощь!
Pierre