7

фона - Пакетное unfaulting:
NSFetchRequest позволяет партия unfault - например, использовать запрос 1000 результатов, это принесло бы все как ошибки, то было бы unfault X объектов на (например, индекс 0-20, затем 21-40 и т. д.)CoreData заказал отношения - партию unfaulting с использованием NSFetchRequest

Такое поведение отлично подходит для использования в NSFetchResultsController для UITableViewDataSource и позволяет быстро прокручивать пользовательский интерфейс, так как он не помещает объекты один за другим.

Теперь к моей проблеме:
Я использую упорядоченные отношения для списков объектов, скажем сообщения.

Поскольку сообщение может появиться на многих списки на моей модели, я не могу сохранить свой индекс в каждом списке на сообщение лиц и использовать его в качестве параметров для заказа результатов.

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

Есть ли какой-либо способ для NSFetchResultsController для извлечения в соответствии с порядковыми отношениями? Или есть пакетный невосприимчивый API, который не является частным?

ответ

3

В настоящее время у меня есть решение для этого, но не чистый один:
Я хочу, чтобы группа была не в порядке по группам из 20, в упорядоченных отношениях.

Итак, каждый раз, когда я обращаюсь к индексу, его индекс делит на 20 (индекс% 20 == 0), Я использую новый NSFetchRequest для следующих 20 и не исправляю их, вызывая общее имя поля.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    if (indexPath.row % 20 == 0) { 
     NSArray *objectsToUnfault = [[someObject.orderedRelationship array] subarrayWithRange:NSMakeRange(indexPath.row, MIN(20, [someObject.orderedRelationship count] - indexPath.row))]; 
     // It's important to hold on this array, otherwise objects fault back 
     self.lastPrefetch = [self preFetchEntityOfClass:[Post class] faultObjects:objectsToUnfault error:&error]; 
    } 
//... continue and create cell 
} 


- (NSArray *)preFetchEntityOfClass:(Class)entityClass faultObjects:(NSArray*)objects error:(NSError **)error { 
    NSEntityDescription *entityDescription = [NSEntityDescription entityForName:NSStringFromClass(entityClass) inManagedObjectContext:self.managedObjectContext]; 
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF in %@", objects]; 
    NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
    [request setEntity:entityDescription]; 
    [request setPredicate:predicate]; 
    [request setFetchBatchSize:MIN([objects count], 20)]; 
    NSArray *results = [self.managedObjectContext executeFetchRequest:request error:error]; 
    // I assume all my objects has this field "uid" 
    NSArray *resultsUid = [results valueForKey:@"uid"]; //Batch unfaulting (results is a BatchFaultArray, private class type) 
    if ([resultsUid count] != [results count]) { 
     NSLog(@"Error: wrong count of uids"); //We need to use resultsUid, to avoid compiler opt 
    } 
    return results; 
} 
+1

это приятное обходное решение –

1

Я надеюсь, что я правильно понял ваш вопрос,

Я нашел ответ, пожалуйста, смотрите ответ и комментарии adonoho

NSFetchedResultsController and NSOrderedSet relationships

+0

Извините, но, как я уже сказал, в моем случае сообщение может появляться в неизвестном (большом) количестве списков, поэтому я не могу держать его индекс в каждом списке. – avishic