5

NSDate値を指すキーを使用してNSSortdescriptorを使用して、NSFetchRequestの結果を並べ替えようとしています。私のフェッチ結果は、明確な理由もなく完全にランダムになります。

私が使用しているNSManagedObjectContextは、NSOperationのサブクラスで作成されたネストされた子コンテキストからの保存で更新されます。親(メイン)コンテキストから必要なすべてのデータを取得できるため、これがすべて正常に行われたことを知っています。それからフェッチすると、日付でソートされません!

奇妙なことは; 2つの日付の間でエンティティ(「Tweet」と呼ばれる)を選択するための述語は問題なく機能します。

これが私の問題を説明するためのいくつかのコードです:

NSSortDescriptor* timeDescriptor = [NSSortDescriptor
                                        sortDescriptorWithKey:@"time"
                                        ascending:NO
                                        selector:@selector(compare:)];

NSFetchRequest* request = [NSFetchRequest fetchRequestWithEntityName:@"Tweet"];
[request setSortDescriptors:[NSArray arrayWithObjects:timeDescriptor, nil]];

NSPredicate* predicate = [NSPredicate predicateWithFormat:@"((time >= %@) AND (time <= %@))",startDate,endDate];
[request setPredicate:predicate];

NSManagedObjectContext* context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[context setParentContext:[[NSApp delegate] managedObjectContext]];
[context performBlock:^{
    NSError* error = nil;
    NSArray* results = nil;

    results = [context executeFetchRequest:request error:&error];
    // Results here are not ordered correctly

    // 2nd try sorting results using fetched array (works!)
    results = [results sortedArrayUsingDescriptors:[NSArray arrayWithObjects:timeDescriptor, nil]];

    // This works too but not needed anymore
    /*results = [results sortedArrayUsingComparator:^(id obj1, id obj2) {
        Tweet* tweet1 = (Tweet*)obj1;
        Tweet* tweet2 = (Tweet*)obj2;
        //return [tweet1.time compare:tweet2.time]; // ascending
        return [tweet2.time compare:tweet1.time]; // descending
    }];*/

    if ([results count] > 0) {
        for (uint i = 0; i < [results count]; i++) {
            Tweet* tweet = [results objectAtIndex:i];
            NSDate* date = Tweet.time;
            NSLog(@"tweet date: %@", date);
        }
    }
}];

NSSortDescriptorがフェッチで機能しない理由を誰かに教えてもらえますか?

ありがとう!

- アップデート -

PerformBlockメソッドを使用せずに、メインスレッドのメイン(親)managedObjectContextからフェッチすると、NSSortDescriptorが正常に機能するようです。これでも、NSPrivateQueueConcurrencyTypemanagedObjectContextでソートされたフェッチを実行するのに役立ちません。PerformBlock内にNSFetchRequest、NSSortDescriptor、およびNSPredicateを作成しても、問題は修正されません。

4

3 に答える 3

3

まったく同じ問題がありました。NSFetchRequest インスタンスの includesPendingChanges プロパティを NO に設定することで問題を解決しました。

于 2012-05-28T23:50:11.073 に答える
-1

デフォルトの compare: セレクターを使用すると、記述子を単純化できます。

NSSortDescriptor* timeDescriptor = [NSSortDescriptor
                                        sortDescriptorWithKey:@"time"
                                        ascending:NO];

しかし、それは余談です。重要なのは、ネストされた子コンテキストから更新しているという事実だと思います。オブジェクトに永続的なオブジェクト ID があることを検証します。彼らはまだそれらを受け取っていない可能性があるため、それがフェッチの問題である可能性があります。そうである場合は、ネストされた子コンテキストを保存する前に objectPermanentIDsForObjects: を呼び出してみてください。

于 2012-04-22T08:11:34.967 に答える