Hm. Первая оптимизация, которую я бы предложил, была бы
for (Deck *deck in self.deckArray) {
if ([deck.beenSeen isEqualToNumber:[NSNumber numberWithInt:1]]) {
[deck setBeenSeen:[NSNumber numberWithInt:0]];
}
}
[self.managedObjectContext save:&error];
Я подозреваю, что это может ускорить выполнение одного большого сохранения контекста вместо 2000 маленьких.
Вторым предложением будет попытка избавиться от теста if
- если большинство ваших значений beenSeen
изменяются с 1 на 0, а остальные уже равны 0, то вы можете просто установить все из них до 0 и сэкономить время проверки каждого в отдельности. (С другой стороны, если имеется 10 000 объектов, а вы сбрасываете 2000 из них, то избавление от теста может быть неоптимальным.)
for (Deck *deck in self.deckArray) {
[deck setBeenSeen:[NSNumber numberWithInt:0]];
}
[self.managedObjectContext save:&error];
}
Третьим предложением было бы подумать о реализации этого другого способа - например, ваш объект колоды мог бы реализовать атрибут lastSeen
, сохраняя дату и время, когда колоду видели в последний раз, а затем вместо массового сброса (и записывая 2000 строк базовых данных), вы можете просто проверить дату и время каждой колоды lastSeen
с отметкой времени последнего обновления пользователя.