7

Background - Batch unfaulting:
NSFetchRequest pozwala partia unfault - na przykład użyć kwerendy 1000 wyników, przyniosłoby to wszystko jako wady, wtedy byłoby unfault obiektów X przy czas (tj. indeks 0-20, następnie 21-40, itp.)CoreData uporządkowane relacje - partię unfaulting użyciu NSFetchRequest

To zachowanie jest świetne, gdy jest używane w NSFetchResultsController dla źródła UITableViewDataSource i umożliwia szybkie przewijanie interfejsu użytkownika, ponieważ nie powoduje ono pojedynczych obiektów.

Teraz mój problem:
używam uporządkowane relacje dla wykazów obiektów, powiedzmy posty.

Ponieważ post mogą pojawić się na wielu listach w moim modelu, nie mogę zapisać swój indeks w każdych list na post podmiotu i używać go jako param zamawiania wyników.

Na razie nie znalazłem sposobu pobrania NSFetchRequest zgodnie z tą kolejnością, więc nie mogę użyć tej funkcji. Tak więc zajmuję się relacją z indeksem i kończę się niepowodzeniem jeden po drugim, co powoduje przewijanie.

Czy istnieje sposób pobierania przez NSFetchResultsController zależności między kolejnością? Czy istnieje interfejs API, który nie jest prywatny?

Odpowiedz

3

Obecnie mam rozwiązanie, ale nie czyste jeden:
Chcę podzielić niepowodzenie grupami po 20, w uporządkowanym związku.

Tak więc, za każdym razem, gdy adres indeksu, że jego indeks dzieli się przez 20 (indeks% 20 == 0), używam nowego NSFetchRequest przez następne 20 i zakłócić je przez wywołanie wspólnej nazwy pola.

- (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

To miłe obejście –

1

Mam nadzieję, że zrozumiał swoje pytanie poprawnie,

Znalazłem odpowiedź, proszę spojrzeć na odpowiedź i komentarze adonoho

NSFetchedResultsController and NSOrderedSet relationships

+0

Niestety, ale jak powiedziałem, w moim przypadku, może pojawić się po nieznanym (duże) liczby list, więc nie mogę utrzymać swój indeks na każdej liście. – avishic

Powiązane problemy