Вопрос: быстро обновляйте и сохраняйте отношения между таблицами с большим количеством данных после того, как обе или одна таблица уже сохранены.
У меня есть пять таблиц TvGenres, TvSubgenre, TvProgram, Channels, TvSchedules со связями между ними, как показано на изображении ниже
Теперь проблема в том, что загрузка всех данных происходит в последовательности, основанной на предыдущих данных, и в отличие от SQLite, мне нужно установить отношения между ними, и для этого мне нужно снова и снова искать таблицу и устанавливать связь между ними, которая является временной. так как я могу сделать это быстрее
Я использую 2 разных подхода для решения, но оба работают не так, как ожидалось
Сначала позвольте мне рассказать, как работает загрузка
Сначала я выбираю все детали каналов на основе языков пользователя.
Из каналов я выбираю все расписания на следующую неделю (это много данных (около 30 000+))
И из данных расписаний я выбираю все данные программ (это опять-таки много данных)
Подход 1,
Загрузите все данные и создайте их список объектов, а затем сохраните их сразу после завершения загрузки, но установление отношений между ними требует времени и, что самое страшное, теперь цикл повторяется дважды, так как сначала я должен выполнить цикл для создания всего класса список, а затем цикл снова, чтобы сохранить их в табличном представлении и все еще не решить проблему, требующую много времени для отношений.
Подход 2
Загрузка по одному, например загрузка каналов, сохранение их, загрузка расписаний, сохранение их, загрузка программ и сохранение их в основных данных. Все в порядке, но теперь каналы связаны с расписанием, а расписания связаны с программами и устанавливают отношение, в то время как я храню расписания, я также выбираю канал, связанный с этим расписанием, и затем устанавливаю отношение, то же самое для программы и расписаний, и это занимает время, приведенное ниже, это код, так как я могу решить эту проблему или как я должен загрузить и сохранить, чтобы она стала как можно быстрее.
Код только для хранения расписаний
func saveScheduleDataToCoreData(withScheduleList scheduleList: [[String : Any]], completionBlock: @escaping (_ programIds: [String]?) -> Void) {
let start = DispatchTime.now()
let context = coreDataStack.managedObjectContext
var progIds = [String]()
context.performAndWait {
var scheduleTable: TvSchedule!
for (index,response) in scheduleList.enumerated() {
let schedule: TvScheduleInformation = TvScheduleInformation(json: response )
scheduleTable = TvSchedule(context: context)
scheduleTable.channelId = schedule.channelId
scheduleTable.programId = schedule.programId
scheduleTable.startTime = schedule.startTime
scheduleTable.endTime = schedule.endTime
scheduleTable.day = schedule.day
scheduleTable.languageId = schedule.languageId
scheduleTable.isReminderSet = false
//if I comment out the below code then it reduce the time significantly from 5 min to 34.74 s
let tvChannelRequest: NSFetchRequest<Channels> = Channels.fetchRequest()
tvChannelRequest.predicate = NSPredicate(format: "channelId == %d", schedule.channelId)
tvChannelRequest.fetchLimit = 1
do {
let channelResult = try context.fetch(tvChannelRequest)
if channelResult.count == 1 {
let channelTable = channelResult[0]
scheduleTable.channel = channelTable
}
}
catch {
print("Error: \(error)")
}
progIds.append(String(schedule.programId))
//storeing after 1000 schedules
if index % 1000 == 0 {
print(index)
do {
try context.save()
} catch let error as NSError {
print("Error saving schdeules object context! \(error)")
}
}
}
}
let end = DispatchTime.now()
let nanoTime = end.uptimeNanoseconds - start.uptimeNanoseconds
print("Saving \(scheduleList.count) Schedules takes \(nanoTime) nano time")
coreDataStack.saveContext()
completionBlock(progIds)
}
Также, как сделать правильное пакетное сохранение с помощью пула autoreleas
PS: Все материалы, которые я нашел, относящиеся к базовым данным, стоят дорого и стоят более 3 тыс., А с бесплатной информацией не так много, просто базовые вещи, даже в документах Apple нет большого кода, связанного с настройкой производительности и пакетными обновлениями. и передача отношений. Заранее благодарим за помощь.