Правильный способ обновления NSTableView в приложении Core Data

У меня есть проект Core Data с NSTableView, где столбцы связаны с NSArrayController. В свою очередь, контроллер 'содержимое привязано к главному контексту управляемого объекта AppDelegate.I '

V субкласс NSTextFieldCell 's, чтобы обеспечить более настраиваемый способ отображения данных. Кажется, все работает хорошо, но когда я перечисляю объекты в контексте и изменяю атрибут, NSArrayController не 'Кажется, я передаю новые значения в таблицу. Я знаю, что ониизменяются в процессе работы sortDescriptors, и таблица организуется в соответствии с новыми данными, но все еще отображает старые значения. Я'Я предполагаю, что это до утилизации NSCell 'с отображением данных: хотя базовые значения были изменены в основной базе данных, онине перерисовывать.

После попытки различных уведомлений KVO с[myArrayController willChangeValueFor: aKeyPath] и соответствующийdidChange а также просто[myTable reloadData], Мое единственное решение состояло в том, чтобы отсоединить привязку managedObjectContext контроллера и заново подключить его после обработки, например так:

self.hasBackgroundOp = YES;
self.isCancelled = NO; //can get changed with a 'cancel' button in the UI
    if (self.managedObjectContext.hasChanges) {
        [self. managedObjectContext save:nil];
    }
    [myArrayController setManagedObjectContext:nil]; //brutal un-hooking of controller
    dispatch_group_t dispatchGroup = dispatch_group_create();
    dispatch_group_async(dispatchGroup, dispatch_get_global_queue(0, 0), ^{
        .
        .
        // create a thread context, set the persistent store co-ord
        // and do some processing on the
        // NSManagedObjects that are fetched into an array just
        // for the purpose of this thread
        .
        .
        [ctx save:&error];
        //and after the processing is finished then refresh the table
        dispatch_async(dispatch_get_main_queue(), ^{
            [myArrayController setManagedObjectContext:self.managedObjectContext]; //this forces re-drawing of the table
            self.hasBackgroundOp = NO;
            self.isCancelled = NO;
        });
    });

Это кажется очень жестоким делом[myArrayController setManagedObjectContext:nil]; а затем установить его снова, чтобы обновить таблицус содержанием. Я просто могуя не верюЯ сделал это правильно, хотя он работает просто отлично. Кто-нибудь может посоветовать лучший способ? Спасибо!

ОБНОВЛЕНИЕ: фактически установка контекста управляемого объекта нерешить проблему. Кажется, перестал работать. Если код запускается дважды подряд, приложение просто зависает. Закомментируйте-setManagedObjectContext: строки и код могут быть запущены столько раз, сколько требуется.

В ответ на комментарии моя пользовательская ячейка использует для отображения следующее:

NSInteger index = [[self stringValue] integerValue] + 1;
NSAttributedString *cellText = [[NSAttributedString alloc] initWithString:[NSString stringWithFormat:@"%lu",index] attributes:attributes];
NSRect textRect;
textRect.origin = cellFrame.origin;
textRect.origin.x += (cellFrame.size.width - cellText.size.width) / 2;
textRect.origin.y += (cellFrame.size.height - cellText.size.height) / 2;
textRect.size.width = cellText.size.width;
textRect.size.height = cellText.size.height;
[cellText drawInRect:textRect];

Контроллер массива настроен в главном кончике и имеет егос контекстом управляемого объекта, привязанным к AppDelegate 's. В nib нет запросов на выборку или предикатов - дескриптор сортировки привязан в AppDelegate 'код:

[myArrayController setSortDescriptors:[NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:kINDEX ascending:YES]]];

Ответы на вопрос(1)

Ваш ответ на вопрос