0

ソート記述子を持つフェッチ要求「foo」があります (整数 16 属性を降順でソートします)。したがって、フェッチ要求を実行します。

__block NSArray *results = nil;

[_managedObjectContext performBlockAndWait:
 ^{
     results = [_managedObjectContext executeFetchRequest:<foo> error:nil];
 }];

return results;

iOS 6 以降でこのフェッチ要求を実行すると、結果は指定/期待どおりに並べ替えられます (逆整数インデックス順)。

しかし、iOS 5.1 で実行すると、結果がソートされません!

しかし、まったく同じソート記述子を結果配列にすぐに適用すると、次のようになります。

results = [results sortedArrayUsingDescriptors:<foo>.sortDescriptors];

結果は正しくソートされます。

他の誰かがこのようなことに遭遇しましたか? もしそうなら、あなたは原因を発見しましたか?

ありがとう!

カール

PS: 関連があることが判明した場合に備えて、「foo」の定義は次のとおりです。

-(NSFetchRequest *)fetchRequestForUnparsedStoriesOfStoryListWithId:(id)storyListId
{
    NSPredicate *hasStoryListWithIdPredicate = [NSPredicate predicateWithFormat:@"ANY lists.id = %@", storyListId];
    NSPredicate *isUnparsedStoryOfStoryListWithIdPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:@[hasStoryListWithIdPredicate, self.isUnparsedPredicate]];

    NSFetchRequest *fetchRequestForUnparsedStoriesOfStoryListWithId = [NSFetchRequest fetchRequestWithEntityName:@"Story"];
    fetchRequestForUnparsedStoriesOfStoryListWithId.predicate = isUnparsedStoryOfStoryListWithIdPredicate;
    fetchRequestForUnparsedStoriesOfStoryListWithId.sortDescriptors = [NSArray arrayWithObject:self.descendingIndexSortDescriptor];

    return fetchRequestForUnparsedStoriesOfStoryListWithId;
}

ソート記述子の定義は次のとおりです。

-(NSSortDescriptor *)descendingIndexSortDescriptor
{
    if (! _descendingIndexSortDescriptor)
    {
        self.descendingIndexSortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"index" ascending:NO];
    }

    return _descendingIndexSortDescriptor;
}

PPS: このフェッチのコンテキストに関するもう少しのコンテキスト: これは、1) バックグラウンド スレッド/バックグラウンド MOC (NSPrivateQueueConcurrencyType を持つネストされた MOC) のサーバー情報の解析により、いくつかの基本的なプロパティが決定された後、アプリの起動時に発生します。 、次に 2) バックグラウンド MOC に一連の Story エンティティを作成し、(とりわけ) 並べ替え対象のインデックスを持ち、3) そのバックグラウンド MOC に変更を保存しました。これらの操作が完了した直後にのみ、上記のフェッチ要求が実行され、同じバックグラウンド スレッドとバックグラウンド MOC で実行されます。ここを読んで: NSManagedContext からのフェッチ結果に対して NSSortdescriptor が無効です—「データが永続ストアに保存されない限り、マスターコンテキストのデータがダーティである、つまり変更されている場合、並べ替えは機能しません」、ステップ 3) で保存を強制しようとしました) " 永続ストア (つまり、ディスク) へのネストされた MOC チェーンですが、それも効果がありませんでした: iOS 5.1 (のみ) では、このフェッチの結果は、フェッチを実行した後に「手動で」結果をソートしない限り、ソートされません。 .

4

2 に答える 2

0
  1. おそらく、この方法で performBlockAndWait を使用したくないでしょう。これは再入のみを目的としているため、自動解放プールやユーザー イベントなど、performBlock が行うことの一部を行うことはできません。ユーザーイベントは、コアデータが期待どおりに機能するために非常に重要です。たとえば、 performBlockAndWait 内で行われた変更は、NSManagedObjectContext 通知をトリガーしません! 詳細については、iOS 5 コア データのリリース ノートを参照してください。

  2. iOS 5.x の CoreData には、iOS 6 で修正された既知の問題が多数あります。リストするには多すぎます。親コンテキストに変更があるとソートが機能しないというものもありましたし、ソートに関してもあったと思います。残念ながら、これらのレーダー番号はもうありません。

WWDC 2012 セッション 214「コア データのベスト プラクティス」に示されているように、performBlockAndWait の代わりにセマフォで performBlock を使用すると、同じ並べ替えの問題が発生しますか?

于 2013-09-27T01:07:28.213 に答える