добавление объекта к отношениям приводит к тому, что отношения с обеих сторон сжигаются. Так что, если у вас есть A << - >> B и вы говорите, что пытаетесь добавить только что созданный объект A к объекту B, который уже имеет отношение к 100 000 объектов A, CoreData извлечет эти 100 000 объектов из хранилища, чтобы выполнить это отношение до того, как добавление новых отношений.
Тот факт, что вы периодически очищаете контекст mangedobjectcontext, означает, что все 100 000 компакт-дисков с объектами, загруженными для выполнения отношений, теперь необходимо перезагружать заново, что делает процесс чрезвычайно медленным.
Одним из способов решения этой проблемы является двухэтапный процесс импорта. Сначала загрузите все объекты в БД, не устанавливая никаких отношений, но следите за тем, какие отношения нужно добавить. Как только вы сделаете быстрый импорт, как это, вернитесь к БД и добавьте отношения и очистите контекст таким образом, чтобы избежать необходимости частой перезагрузки этих данных. Так, в качестве конкретного примера, если вам нужно импортировать 1 миллион A
, которые должны быть связаны с 100 B
, сначала импортируйте все A
, а затем для каждой из сотен B загрузите взаимосвязи один раз и добавьте все как к нему, очистите контекст, перейдите к следующему B и так далее. Ключевым моментом здесь является предотвращение сброса контекста тех записей 100 000, которые он только что мучительно загружал.
Другой способ обойти это - вместо того, чтобы регулярно сбрасывать весь контекст, обновлять только те объекты, от которых вы хотите избавиться.
О, еще одна вещь, вы могли бы также рассмотреть возможность однонаправленных отношений в CoreData и использовать явную выборку, чтобы получить другую сторону отношений
EDIT
Я думаю, что нашел обходной путь. Вам нужно вызвать примитивные средства доступа. так что-то вроде
[self.primitiveTags addObject:tag];
Предварительные испытания, кажется, показывают, что это не заставляет другую сторону отношений стрелять