0

私の質問はかなり単純だと思いますが、それに対するまともでエレガントな解決策を見つけることができないようです。Core Dataに洗練されたソリューションがないか、Googleのスキルが私を失望させたのかもしれません。その場合は、お詫び申し上げます。

簡単なメッセージングアプリケーションがあるとしましょう。2つのコアデータエンティティがあります:ThreadMessage。AThreadには多くのが含まれていMessagesます。

Threads私のアプリケーションは、すべてがリストされているUITableViewで開くはずです。アプリケーションは、RestKitとそのオブジェクトマッピングメカニズムを使用してデータをロードします。Messagesプロパティがありますcreated

そこで、スレッドのリストを並べ替えて、最新のメッセージを含むスレッドが上に表示され、最も古いメッセージを含むスレッドが下に表示されるようにします。

これはApple自身のメッセージングアプリケーションでも起こっていることであり、CoreDataも使用していると思います。これが、たとえばデータベース内の最新のメッセージへの1つの関係に余分なものを格納するよりも洗練されたソリューションがあることを願う主な理由です。私の場合、RestKitオブジェクトマッピングを使用しており、HTTP APIに影響を与えないため、これは実用的ではありません。

一時的な値を試しましたが、並べ替えることができないため、これは機能しません。NSComparisonResultブロックを使用して並べ替え記述子を試しましたが、コアデータでは、多くの関係で並べ替えることができないと記載されているため、これも機能しません。フェッチされたプロパティを調べましたが、使用する述語がわかりません。

前もって感謝します。

4

2 に答える 2

2

クラスの読み取り専用lastMessageDateプロパティを作成できますThread。スレッドメッセージから最新の日付を返す独自のゲッターを実装します。次に、このプロパティを使用してスレッドを並べ替えます。

NSArray *sortedThreads = [threads sortedArrayUsingComparator: ^(Thread *thread1, Thread *thread2) {
    return [thread2.lastMessageDate compare:thread1.lastMessageDate];
}];
于 2012-09-14T11:48:18.323 に答える
0

次のようにコアデータオブジェクトをフェッチしているときにNSSortDescriptorを試しましたか?

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription 
                               entityForName:YOUR_ENTITY inManagedObjectContext:[AppDelegate objectModel]];

[fetchRequest setEntity:entity];

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"createdOn" ascending:YES];

NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[fetchRequest setSortDescriptors:sortDescriptors];



NSError *error;
NSMutableArray *mutableFetchResults = [[[AppDelegate objectModel] executeFetchRequest:fetchRequest error:&error] mutableCopy];

if (!mutableFetchResults) {
    // Handle the error.
    NSLog(@"Fetching data failed: %@", error);
}

return mutableFetchResults;
于 2012-09-14T12:21:33.430 に答える