Having eine App, macht genau das gleiche, hier sind meine Einsichten.
Zunächst sollten Sie Coredata und Multithreading mit Bedacht vor dem Codieren betrachten. Wenn Sie Hilfe brauchen, lassen Sie es mich wissen.
Das Modell
Sie sind mit Einrichtungen in Coredata arbeiten, die wie Tabellen in SQLite betrachtet werden können, sondern in einer abstrakteren Art und Weise. Sie sollten review Apple's documentation dafür.
Wir können in Ihrem Fall mindestens drei verschiedene Entitäten finden: Benutzer, Konversation und Nachricht. (Seien Sie vorsichtig mit dem letzten, ich hatte ein Problem mit der Entität mit der Bezeichnung Nachricht beim Importieren des SMS-Frameworks, sollten Sie den Namen der Entität voranstellen.)
Ein Problem mit Coredata ist, dass Sie nicht direkt speichern können Arrays (kann mit einem unbekannten Typ sein), aber trotzdem. So zwei Lösungen, um Ihre Benutzer zu speichern: entweder in einem NSString, wenn sie durch Kommata begrenzt werden und eine einfache regex oder Split geben Sie die Anzahl der Benutzer ..
so könnte Ihr Modell wie folgt aussehen:
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
}
Konversation muss eine zu viele Beziehung zu Nachricht und Nachricht eine Eins-zu-Eins-Beziehung zu Konversation haben.
--edit
Wenn Sie die letzte Nachricht einer Konversation ebenso wie die Nachricht App (oder meine app) angezeigt werden sollen, können Sie eine Beziehung mit Nachricht hinzufügen. Die Nachricht wird nicht zweimal in der Datenbank/Coredata gespeichert. In der Tat, Sie erstellen ein Coredata-Objekt (in diesem Fall eine Nachricht) und dass Sie es zu einer Konversation hinzufügen, was im Inneren passiert ist, dass eine Konversation die Coredata-ID für das Objekt speichern. Das Hinzufügen einer Beziehung für diese Nachricht (lastMessage) speichert nur eine andere ID und kein anderes Objekt.
--end von EDIT
Benutzer sind etwas anders, weil sie Teil mehrerer Gespräche sein kann (wegen der Gruppengespräch), das ist, warum Sie eine many-to-many-Beziehung Schiff benötigen.
Sie können so viele Attribute hinzufügen, wie Sie möchten, aber das ist die Mindestanforderung!
- Implementierung
dann in Ihrem Code, wenn Sie das Verhalten von iMessage nachahmen wollen, hier ist das, was ich getan habe:
in der ersten Steuerung, wo Sie alle Konversation sehen : Verwenden Sie einen NSFetchedResultController. Die Abfrage sollte nur über die Entität Conversation erfolgen.
Wenn ich auf eine Zeile klicke, habe ich in der neuen Ansicht das Konversationsobjekt und einen weiteren NSFtechedResultController. Ich frage dann nur die Entity Message ab, aber mit einem Prädikat, das angibt, dass ich nur diese Konversation möchte.
Wenn Sie meine App überprüfen, um zu sehen, die Fluidität wollen, go to this link.
EDIT
- -Code-Schnipsel die letzte Nachricht eines Gesprächs
Vorsicht zu finden: Diese ist eine vorläufige Antwort, bevor ein besserer Weg gefunden wird, dies zu tun (dh wenn geholte Eigenschaften verwendet werden)
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;
--end von EDIT
Hope this Hilfe!
Pierre
Ich ging mit Ihrem Vorschlag, aber beim Lesen der Konversationsliste - wie bekomme ich die letzte Nachricht dort zu zeigen (wie Sie in der "Nachrichten" -Bildschirm).? Vielen Dank. –
Hallo Gilad Ich habe meine Antwort leicht bearbeitet. Fügen Sie einfach eine Eins-zu-Eins-Beziehung hinzu, die lastMessage oder was auch immer Sie wollen. Jedes Mal, wenn Sie eine neue Nachricht erhalten/delete_the_last_one, aktualisieren Sie einfach das Feld lastMessage. Wenn Sie kein Fan von Hinzufügen einer zusätzlichen Beziehung sind, könnte ich raten in NSFetchRequest für jede Konversation graben, um die letzte Nachricht zu finden, aber es kann sehr schlecht sein, Leistung weise. Hoffe, dass hilft – Pierre
Vielen Dank Pierre - das ist, was ich schließlich getan habe. Ich habe ein kleines Problem beim Entfernen einer Nachricht (ich muss jetzt die letzte Nachricht manuell identifizieren und mein Konversationsobjekt aktualisieren), aber zumindest bekomme ich den Verlauf richtig. Vielen Dank!!! –