Nano Hash - криптовалюты, майнинг, программирование

Еще одно многопоточное использование основных данных

Я совершенно новичок в Core Data, и мне было интересно, как лучше всего подойти к следующей задаче, которую я хочу выполнить (даже если мне вообще следует использовать Core Data):

  • У меня есть несколько сущностей с разными отношениями 1-к-1 и 1-ко-многим между ними.

  • Я хочу показать пользователю «консолидированный» набор информации в табличном представлении.

  • Чтобы получить эту «консолидированную» информацию, мне нужно сделать гораздо больше, чем просто получить несколько строк. Мне нужно получить какие-то сущности, отфильтровать их по каким-то алгоритмам, вычислить какую-то информацию (хранящуюся в переходных свойствах) и т.д.

  • Получив результат (сокращенный набор экземпляров), я хочу показать его пользователю.

  • Поскольку это сложная задача, я хочу выполнить ее в отдельном фоновом потоке.


Сказал, что когда у меня есть готовый набор выбранных ManagedObject:

  • Должен ли я передавать только их «идентификаторы» в основной поток, чтобы обновить их в основном ManagedContext? Что я могу сделать с временной информацией, которая была рассчитана (для отображения вместе с другими данными в ячейках таблицы).

  • Разве я не мог просто передать их обратно, чтобы показать?

  • Что касается последнего вопроса, могу ли я «заблокировать» ManagedContext, чтобы гарантировать, что данные передаются без проблем (я читал, что это может быть вариант)?

  • Подходят ли Core Data для такого использования? Должен ли я рассмотреть другой подход/технологию?


Заранее спасибо


Ответы:


1
  • Должен ли я передавать только их «идентификаторы» в основной поток, чтобы обновить их в основном ManagedContext? Что я могу сделать с временной информацией, которая была рассчитана (для отображения вместе с другими данными в ячейках таблицы).
  • Разве я не мог просто передать их обратно, чтобы показать?

нет необходимости передавать идентификаторы, вы можете легко вызвать NSOperation для выполнения вашего расчета, а также получить и сохранить свой набор объектов, а затем в конце расчета вам просто нужно позвонить:

[tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:YES];

Что приведет к тому, что таблица снова вызовет свои селекторы делегатов. Важно то, что вы должны хранить полученные объекты в источнике данных, к которому имеют доступ селекторы делегатов, например, это может быть NSArray:

@property(nonatomic,strong) NSArray *datasource;

-(void)loadDataAsynchronously {

    NSOperationQueue *queue = [NSOperationQueue new];
    NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self
                                                                            selector:@selector(loadData)
                                                                              object:nil];

    [queue addOperation:operation];
}

-(void)loadData{
  // do your calculation and store into array
  self.datasource=......

  // reload on main thread
  [tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:YES];
}

- (UITableViewCell *)tableView:(UITableView *)table cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    YourObject *obj = [[self datasource] objectAtIndex:indexPath.row];
    YourTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"tableCell"];
    cell.cellTitle.text=obj.titleForCell;
    cell.cellDescr.text=obj.descriptionForCell;
    return cell;
}
  • Что касается последнего вопроса, могу ли я «заблокировать» ManagedContext, чтобы гарантировать, что данные передаются без проблем (я читал, что это может быть вариант)?

После извлечения объекта нет необходимости блокировать CoreData, если у вас есть таблица только для чтения. В противном случае, если вы знаете о фоновом потоке, который мог изменить ваши уже отображаемые данные, и ваша таблица может быть отредактирована и сохранена, вам нужно внедрить сложную логику для работы с этим. Или вы получите «ошибку несоответствия». Но если у вас есть таблица только для чтения, вы можете, например, предупредить контроллеры, если кто-то изменил данные, и попросить их перезагрузить таблицу.

  • Подходят ли Core Data для такого использования? Должен ли я рассмотреть другой подход/технологию?

Да, единственный момент, о котором вам следует позаботиться, это то, какие вычисления вы делаете. Самая частая ошибка — думать о CoreData как о базе данных SQL, а не о графе объекта (ошибка, которую я совершал чаще всего), поэтому многие операции с частицами и точными sql-подобными операциями невозможны. Во многих случаях вы закончите получать набор критериев, на основе которого вам придется выполнять дальнейшие вычисления памяти. Но, честно говоря, несмотря на то, что многие говорят, что если у вас нет тысячи записей, я обнаружил, что все устройства iOS работают очень быстро для разумного объема данных.

29.02.2012
  • Спасибо за ответ. ‹br/› Я задал первый вопрос, потому что всегда говорилось: «Никогда не пересекайте границы тем». ‹br/› Я пришел из программирования на Java, и отсутствие потокобезопасности не то же самое, что не передавать его между потоками. Вам просто нужно знать, что вы делаете, и использовать синхронизацию с умом. Но некоторая информация может быть связана с потоком, и это может быть причиной. ‹br/› Мой код очень похож на ваш. 01.03.2012
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..