Получение значений из большого словаря во время выполнения в приложении MacOS - PullRequest
0 голосов
/ 24 ноября 2018

Я работаю в основном на рубине / js.Наше приложение MacOS не обновлялось в течение нескольких лет, и сейчас в команде нет никого, кто бы работал на ObjC полный рабочий день.Мне всегда было любопытно, поэтому я взял билет на крошечную функцию в нашем приложении MacOS.

Вот то, к чему это сводится:

У нас есть представление с5 столбцов, один из которых отображает идентификатор элемента.Мы хотим начать отображение названия объекта, связанного с этим идентификатором, которое у нас сейчас есть в гигантском (~ 16k строк) файле json.

Вот как инициализируются столбцы при настройке пользовательского интерфейса:

NSTableColumn * checkedColumn = [[NSTableColumn alloc] initWithIdentifier:@"active"];
[[checkedColumn headerCell] setStringValue:@"Active"];
[checkedColumn setWidth:30];
[checkedColumn setEditable:YES];
[inventoryTable addTableColumn:checkedColumn];

NSTableColumn * idColumn = [[NSTableColumn alloc] initWithIdentifier:@"id"];
[[idColumn headerCell] setStringValue:@"ID"];
[idColumn setWidth:120];
[idColumn setEditable:NO];
[inventoryTable addTableColumn:idColumn];

NSTableColumn * ownerColumn = [[NSTableColumn alloc] initWithIdentifier:@"owner"];
[[ownerColumn headerCell] setStringValue:@"Owner"];
[ownerColumn setWidth:120];
[ownerColumn setEditable:NO];
[inventoryTable addTableColumn:ownerColumn];

NSTableColumn * countColumn = [[NSTableColumn alloc] initWithIdentifier:@"count"];
[[countColumn headerCell] setStringValue:@"Count"];
[countColumn setWidth:120];
[countColumn setEditable:NO];
[inventoryTable addTableColumn:countColumn];

NSTableColumn * pendingColumn = [[NSTableColumn alloc] initWithIdentifier:@"pending"];
[[pendingColumn headerCell] setStringValue:@"Pending"];
[pendingColumn setWidth:70];
[pendingColumn setEditable:NO];
[inventoryTable addTableColumn:pendingColumn];

Я добавил следующее, чтобы создать новый столбец:

NSTableColumn * facilityColumn = [[NSTableColumn alloc] initWithIdentifier:@"facility"];
[[facilityColumn headerCell] setStringValue:@"Facility"];
[facilityColumn setWidth:120];
[facilityColumn setEditable:NO];
[inventoryTable addTableColumn:facilityColumn];

Исходный рендеринг вtableView был такой:

- (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
    IVClient * client = [allClients objectAtIndex:row];
    if ([[tableColumn identifier] isEqualToString:@"id"]) {
        return PropToString(client.id);
    } else if ([[tableColumn identifier] isEqualToString:@"owner"]) {
        return PropToString(client.owner);
    } else if ([[tableColumn identifier] isEqualToString:@"count"]) {
        return [NSNumber numberWithInt:client.count];
    } else if ([[tableColumn identifier] isEqualToString:@"pending"]) {
        return [NSNumber numberWithBool:client.pending];
    } else if ([[tableColumn identifier] isEqualToString:@"active"]) {
        return [NSNumber numberWithBool:client.active];
    }
    return nil;
}

и я добавил условие для соответствия новому значению:

else if ([[tableColumn identifier] isEqualToString:@"facility"]){
    return FacilityNameFromID(client.id);
}

У меня есть только поверхностное представление о том, как взаимодействовать со структурами данных Obj C, но, похоже, это должно быть довольно просто, и мне нужно либо:

1) сохранить порцию данных в словаре и проверять совпадение идентификатора каждый раз, когда мы визуализируем строки

или

2) Сохраните его в БД и запросите по идентификатору.

Кажется, что хранение большого количества данных в словаре является излишним, но я вхожу в это довольно слепо.Если бы я находился в своей зоне комфорта и создавал бэкэнд для API с теми же характеристиками, я бы определенно пошел по маршруту БД.Я просто не знаком с CoreData вообще.

Будет ли # 1 хотя бы реалистичным для меньшего набора данных?

1 Ответ

0 голосов
/ 24 ноября 2018

16K строк или даже записей, на мой взгляд, не считаются «гигантскими» или даже особенно большими.Словарь должен быть адекватным.Конечно, это то, с чего вам следует начать, прежде чем измерять и определять, является ли производительность реальной проблемой.(Преждевременная оптимизация и все такое.)

После этого первой попыткой оптимизации было бы создание свойства только для чтения IVClient с именем facilityName, чья реализация геттера выполняет поиск с кэшированием.То есть что-то вроде:

- (NSString*) facilityName
{
    if (!_facilityName)
        _facilityName = FacilityNameFromID(self.id);
    return _facilityName;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...