NSFetchResultController, комбинация fetchLimit и returnObjectsAsFaults для разбиения на страницы - PullRequest
0 голосов
/ 03 марта 2019

Я использую NSFetchResultsController и пытаюсь заставить работать нумерацию страниц.Я наткнулся на эти два свойства на NSFetchRequest и выделил часть, по которой у меня возник вопрос:

fetchLimit ( docs ):

Для каждого хранилища объектов, кроме хранилища SQL, запрос выборки, выполняемый с ограничением выборки, просто выполняет неограниченную выборку, а отбрасывает незапрошенные строки .

returnsObjectsAsFaults ( документы ):

Эти ошибки являются управляемыми объектами, но все их данные свойств хранятся в кэше строк до тех пор, пока ошибка не будет запущена.При возникновении ошибки Core Data извлекает данные из кэша строк.

Уместно ли объединить эти два свойства?Установите fetchLimit и установите returnsObjectsAsFaults в true?

Когда настройки fetchLimit, CoreData все равно запрашивают все для каждой строки.При использовании NSFetchResultController я настраиваю UITableViewCells на основе объектов из CoreData, поэтому я думаю, что объекты не должны возвращаться как ошибка.Но если я объединю оба свойства, я боюсь, что CoreData запрашивает каждую строку для предиката без ограничения и запрашивает весь объект (не ошибка), основываясь на документации.

У меня есть сомнения, если я должениспользуйте оба свойства.У кого-нибудь есть опыт работы с большими наборами данных в сочетании с NSFetchResultController с нумерацией страниц?Я действительно не знаю, как это отладить.

1 Ответ

0 голосов
/ 18 марта 2019

С помощью NSPredicate и fetchLimits и fetchOffsets это можно сделать.

CDAppDelegate * delegate = (CDAppDelegate*)[[UIApplication sharedApplication] delegate];
NSManagedObjectContext * context = [delegate managedObjectContext];
for(int i = 0; i < 34;i++){
    CDObject * object = [NSEntityDescription insertNewObjectForEntityForName:@"CDObject"
                                                      inManagedObjectContext:context];
    [object setValue:i];
}
[delegate saveContext];

NSFetchRequest* request = [[[NSFetchRequest alloc] init] autorelease];
[request setEntity:[NSEntityDescription entityForName:@"CDObject"
                               inManagedObjectContext:context]];

 NSError* error = nil;

 NSUInteger count = [context countForFetchRequest:request error:&error];
 assert(error == nil);

 NSLog(@"Total count: %u", count);

 request.fetchOffset = 0;    
 request.fetchLimit = 30;

 NSLog(@"Fetch offset: %u, limit: %u", request.fetchOffset, request.fetchLimit);

 NSArray* page1 = [context executeFetchRequest:request error:&error];
 assert(error == nil);

 NSLog(@"Page 1 count: %u", page1.count);

 request.fetchOffset = 30;    
 request.fetchLimit = 30;

 NSLog(@"Fetch offset: %u, limit: %u", request.fetchOffset, request.fetchLimit);

 NSArray* page2 = [context executeFetchRequest:request error:&error];
 assert(error == nil);

 NSLog(@"Page 2 count: %u", page2.count);

[request release];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...