Я работаю в основном на рубине / 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 хотя бы реалистичным для меньшего набора данных?