11

fetchLimit と fetchOffset を含む Core Data クエリに非常に散発的なバグがあります。しばらくの間 (別のテスターと同じように、一度発生するのを見たことがあります)、fetchOffset が無視されているようです。クエリは次のようになります。

NSFetchRequest *fetch = [[NSFetchRequest alloc] initWithEntityName:@"MyEntity"];
NSSortDescriptor *dateDescriptor = [[NSSortDescriptor alloc] initWithKey:@"timestamp" ascending:NO];
NSArray *sortDescriptors = [NSArray arrayWithObject:dateDescriptor];
[fetch setSortDescriptors:sortDescriptors];

fetch.fetchOffset = 500;
fetch.fetchLimit = 1;

NSError *error = nil;
NSArray *objects = [self.managedObjectContext executeFetchRequest:fetch error:&error];
if (objects.count) {
    MyEntity *objectAtLimit = [objects objectAtIndex:0];
}

これはほとんどの場合、希望どおりに 501 番目のオブジェクトを返しますが、壊れた 2 回の場合は最初のオブジェクトを返しました。

データベースに 500 行を超える行がない限り、クエリは実行されません。iOS5を使用しています。managedObjectContext には mainQueueConcurrencyType があります。

この質問で報告されたのと同じ動作のようです: Paging results from Core Data requests , これは決して解決されませんでした (または少なくともリストにはありません)。その場合、fetchOffset はデータモデルに基づいて無視または尊重されているように見えましたに対してテストされています。

パフォーマンスは問題にならないはずなので、これが問題になる場合に備えて、おそらく fetchOffset を使用せずにクエリを書き直すつもりです。しかし、バグがどこにあるのかについて誰かが考えているかどうか疑問に思っています。

4

2 に答える 2

14

今朝、同様の問題に遭遇し、NSManagedObjectContext に変更が保存されていない場合、何らかの理由で fetchOffset が無視される可能性があることに気付きました。コンテキストを保存した後、fetchOffset は正しく解釈されます。

于 2013-03-28T11:51:31.180 に答える