NSManagedObject Пользовательский метод доступа - PullRequest
1 голос
/ 29 мая 2011

Я надеюсь, что кто-то может дать мне несколько полезных советов о том, что с этим делать.

Я пробовал несколько способов отсортировать набор сущностей, которые имеют отношение 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;

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