7

Background - Batch unfaulting:
NSFetchRequest ermöglicht Batch unfault - zum Beispiel eine Abfrage von 1000 Ergebnissen verwenden, würde es alle als Fehler bringt, dann wäre es X-Objekte in einem unfault Zeit (dh Index 0-20, dann 21-40 usw.)Coredata geordnete Beziehungen - Batch unfaulting NSFetchRequest mit

Dieses Verhalten ist bei Verwendung in NSFetchResultsController für eine UITableViewDataSource sehr hilfreich und ermöglicht schnelles UI-Scrollen, da Objekte nicht einzeln nacheinander unfault werden.

Nun zu meinem Problem:
Ich bin mit geordneten Beziehungen für Listen von Objekten, lassen Sie sichBeiträge sagen.

a Seit Beitrag auf einer Menge von Listen auf meinem Modell erscheinen mag, kann ich speichere seinen Index nicht Einheit in allen Listen auf Post und es als param verwenden, um Ergebnisse für die Bestellung.

Im Moment habe ich keinen Weg gefunden, wie NSFetchRequest nach dieser Reihenfolge abzurufen ist, daher kann ich seine Batch-Entstörung nicht verwenden. Also adressiere ich die Beziehung mit einem Index, und am Ende falle ich einzeln ab, was holpriges Scrollen verursacht.

Gibt es eine Möglichkeit für NSFetchResultsController, nach Auftragsbeziehungen abzurufen? Oder gibt es eine Batch-Unfailing-API, die nicht privat ist?

Antwort

3

Zur Zeit habe ich eine Lösung für das, aber nicht sauber one:
Ich möchte unfault von Gruppen von 20, in einer geordneten Beziehung Batch.

Also jedes Mal, wenn ich einen Index, der seinen Index durch 20 dividiert (Index% 20 == 0), Ich benutze eine neue NSFetchRequest für die nächsten 20 und unfault sie durch den Aufruf eines gemeinsamen Feldnamen.

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

das ist eine nette Abhilfe –

1

Ich hoffe, ich verstand Ihre Frage richtig,

ich die Antwort gefunden, schauen Sie bitte die Antwort und Kommentare von adonoho

NSFetchedResultsController and NSOrderedSet relationships

+0

Sorry, aber wie gesagt, auf meinem Fall kann die Post auf unbekannt (große) Anzahl der Listen erscheinen, also kann ich seinen Index auf jeder Liste nicht halten. – avishic