Я надеюсь, что кто-то может дать мне несколько полезных советов о том, что с этим делать.
Я пробовал несколько способов отсортировать набор сущностей, которые имеют отношение client <- >>задание на основе пользовательского метода доступа для свойства клиента в качестве дескриптора первой сортировки, а затем свойства описания задания в качестве дескриптора второй сортировки.
Сначала я попытался использовать переходное свойство, называемое Client.sortValue, и обнаружил, что переходные свойства нельзя использовать в качестве дескрипторов сортировки с NSFetchedResultsController.Поэтому я изменил свойство Client.sortValue, чтобы оно не было временным.
Я никогда не сохраняю значение sortValue в постоянном хранилище.Вместо этого я использую пользовательский метод доступа.По-видимому, пользовательский метод доступа не используется при запуске метода fetechedResultsController executeFetch: .Он вызывается, когда я делаю регистрацию, как показано в коде ниже.Я вижу, что в этом случае используется точка останова в пользовательском методе доступа и просмотр трассировки стека.Я не вижу, как он ломается в методе доступа, когда выполняется executeFetch, но он ломается в методе доступа, когда ведется запись в журнал.
(Странно, у меня он сегодня работал раньше при некоторых обстоятельствах,но не другие. Очевидно, это было отсортировано так, как я хотел, но после того, как я реорганизовал свой код для отслеживания условий, в которых он работал, я больше не видел, как он работает.)
Я пыталсяразличные пользовательские методы доступа, включая следующие:
- (NSString *) primitiveSortValue {
NSString *retVal = nil;
[self willAccessValueForKey:@"lastName"];
[self willAccessValueForKey:@"firstName"];
[self willAccessValueForKey:@"company"];
if (![self.lastName isNullString] ) retVal = [self primitiveValueForKey:@"lastName"];
else if (![self.firstName isNullString] ) retVal = [self primitiveValueForKey:@"firstName"];
else if (![self.company isNullString] ) retVal = [self primitiveValueForKey:@"company"];
else retVal = @"";
[self didAccessValueForKey:@"lastName"];
[self didAccessValueForKey:@"firstName"];
[self didAccessValueForKey:@"company"];
NSLog(@"Sort Value: %@", retVal);
return retVal;
}
Я также попробовал этот метод, прежде чем принять решение переопределить метод примитивного доступа:
- (NSString *) sortValue {
NSString *retVal = nil;
if (![self.lastName isNullString] ) retVal = self.lastName;
else if (![self.firstName isNullString] ) retVal = self.firstName;
else if (![self.company isNullString] ) retVal = self.company;
else retVal = @"";
NSLog(@"Sort Value: %@", retVal);
return retVal;
}
Вот мой метод fetchedResultsController:
#define CLIENT_SORT_KEY @"clientOfJob.sortValue"
- (NSFetchedResultsController *) fetchedResultsController {
if (fetchedResultsController != nil) {
return fetchedResultsController;
}
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription * entity = [NSEntityDescription entityForName:@"Job" inManagedObjectContext:dataInterface.managedObjectContext];
[fetchRequest setEntity:entity];
[fetchRequest setFetchBatchSize:10];
if (segmentedControl.selectedSegmentIndex == 0) { // sort by client, then job dscription
NSSortDescriptor *clientSortDescriptor = [[NSSortDescriptor alloc] initWithKey:CLIENT_SORT_KEY ascending:YES];
NSSortDescriptor *jobSortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"jobDescription" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:clientSortDescriptor, jobSortDescriptor, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
NSFetchedResultsController *aFetchedResultsController =
[[NSFetchedResultsController alloc]
initWithFetchRequest:fetchRequest
managedObjectContext:dataInterface.managedObjectContext
sectionNameKeyPath:CLIENT_SORT_KEY
cacheName:nil];
aFetchedResultsController.delegate = self;
self.fetchedResultsController = aFetchedResultsController;
[aFetchedResultsController release];
[fetchRequest release];
[jobSortDescriptor release];
[clientSortDescriptor release];
[sortDescriptors release];
}
else { // sort by job description
... }
NSError *error = nil;
if (![fetchedResultsController performFetch:&error]) {
NSLog(@"Unresolved Error %@, %@", error, [error userInfo]);
abort();
}
int i = 0;
for (id<NSFetchedResultsSectionInfo> sectionItem in [fetchedResultsController sections]){
NSLog(@"\n***********\nsection %d name %@\n-----------\n",i++, [sectionItem name]);
int j = 0;
for (Job *jobItem in [sectionItem objects]) {
NSLog(@"%d job: %@, client: %@\n",j, jobItem.jobDescription, jobItem.clientOfJob.sortValue);
}
}
return fetchedResultsController;
}