Как настроить NSArrayController с Core Data? - PullRequest
3 голосов
/ 22 ноября 2011

Я пытаюсь программно настроить NSArrayController для работы с Core Data.

Я знаю, что в моем хранилище базовых данных есть содержимое, поскольку я могу вручную извлекать объекты через контекст управляемого объекта.Я подключил NSArrayController к тому же контексту управляемого объекта и затем связал параметр значения NSTableColumn с NSArrayController.

Я попросил NSArrayController извлечь, но он возвращает пустой массив.

Есть предложения о том, что я могу делать неправильно?

Интерфейс

@interface MTTableViewController : NSObject <NSTableViewDelegate, NSTableViewDataSource>
{
    NSMutableArray *tableData;
    MTTableCell *tableCell;        

    IBOutlet NSTableColumn *tableColumn;        
    NSArrayController *dataController;
}

Реализация

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];

    if (self)
    {
        dataController = [[NSArrayController alloc] init];
        [dataController setManagedObjectContext:[[NSApp delegate] managedObjectContext]];
        [dataController setEntityName:@"Track"];
        [dataController setAutomaticallyPreparesContent:YES];

        [dataController fetch:self];
        NSArray *content = [dataController arrangedObjects];        
        NSLog(@"Count :%i", (int)[content count]); //Outputs 0

        tableCell = [[MTTableCell alloc] initTextCell:@""];
        [tableColumn setDataCell:tableCell];
    }

    return self;
}

1 Ответ

3 голосов
/ 20 февраля 2013

fetch: не ожидает загрузки данных, вместо этого он мгновенно возвращается.

Это имеет смысл в среде с включенной привязкой. Обычно у вас есть табличное представление, привязанное к контроллеру массива, которое обновляется при каждом изменении содержимого контроллера.

В этом случае вы можете наблюдать за изменениями в arrangedObjects контроллера:

[self.arrayController addObserver:self forKeyPath:@"arrangedObjects" options:NSKeyValueObservingOptionNew context:NULL];

А потом:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
  NSLog(@"Data: %@", self.arrayController.arrangedObjects);
}

Источник: https://stackoverflow.com/a/13389460

...