0

「会話」と呼ばれるエンティティと「メッセージ」と呼ばれるエンティティを持つ単純な Coredata モデルがあります。基本的に、iPhone の SMS アプリケーションを再現する必要があります。

私は、メッセージから会話への対 1 関係と、会話からメッセージへの対多関係を持っています。

Conversation{
    messages<-->>Message.conversation
}

Message{
    conversation<<-->Conversation.messages
}

アプリを起動するたびに、すべての会話が fetchedResultsController に読み込まれます。Coredata がどのように機能するかを正しく理解していれば、関係があるため、会話にリンクされているすべてのメッセージも読み込まれますよね? すべての会話を同時に読み込まないように、バッチ サイズを設定しました。

私のアプリは長いプル リクエストを介してサーバーに接続されているため、いつでもサーバーからメッセージを受け取ることができます (coredata に追加され、NSNotification を使用してビューに追加を伝えます)。

私の問題は次のとおりです。行を選択すると、スタックに別のビューがプッシュされるため、メッセージが表示されます。私はそれを行う方法を考えていましたが、その理由は次のとおりです。

• リレーションシップを介して与えられたメッセージの NSSet を自分のビューに渡すことができますよね? ただし、そのビューを見ているときにメッセージを受け取ることができるので、ビューに渡された NSSet を更新するにはどうすればよいですか?

• そのビューで別の fetchedresultController を使用することもできますが、その場合、理由もなく以前のビューですべてのメッセージをプリロードすることになりますか? 以前のビューでコアデータをロードしないように指示できますか?

これが十分に明確だったことを願っています。私はちょっと必死で、そのウェブサイトに何人かの専門家がいることを知っています. 他にご不明な点がございましたら、お気軽にお問い合わせください。できるだけ早く詳細情報を提供できるよう努めます。

4

1 に答える 1

5

Coredata がどのように機能するかを正しく理解していれば、関係があるため、会話にリンクされているすべてのメッセージも読み込まれますよね?

リレーションシップをクエリするまで、Messageオブジェクト自体は読み込まれません。それまでは、せいぜいただの欠点 (ゴースト プレースホルダー) です。

通常、Conversationユーザーが最初のテーブルで選択したオブジェクトを渡すだけです。2 番目の tableview コントローラーでは、そのConversationオブジェクトに関連するメッセージを要求します。次に、それらを表示用の配列に並べ替えます。

ただし、messagesリレーションシップが常に新しいMessageオブジェクトで更新される状況の場合は、新しく更新されたオブジェクトのすべての自動通知を受け取るという理由だけで、NSFetchedResultsController (FRC) を使用することをお勧めしMessageます。

これを行うには、Conversation上記のようにオブジェクトを渡し、FRC の述語で次のように使用します。

NSPredicate *p=[NSPredicate predicateWithFormat:@"conversation==%@",passedConversationObject];

次に、通常どおり FRC デリゲート メソッドを実装します。

もちろん、NSManagedObjectContextObjectsDidChangeNotificationコンテキストから 2 つ目のテーブルビュー コントローラーを登録し、これらすべてを直接処理することもできますが、初心者にとっては FRC の方が簡単かもしれません。

于 2011-04-18T18:24:56.370 に答える