Самый быстрый способ получить ссылку на NSMigrationManager при автоматической миграции? - PullRequest
2 голосов
/ 18 января 2011

У меня есть приложение, насыщенное данными, и я реализовал все свои средства миграции CoreData, используя модели визуального отображения в реализациях XCode и NSEntityMigrationPolicy для кода очистки. Оказывается, что миграции на реальном устройстве действительно длительные, иногда для их завершения требуется до пяти минут.

Мне действительно нужно дать отзыв пользователю, когда это происходит, и хочу, чтобы KVO атрибут migrationProgress на NSMigrationManager. Хитрость заключается в том, что addPersistentStoreWithType:configuration:URL:options:error: не позволяет получить ссылку на NSMigrationManager в случае, если он считает миграцию необходимой.

Я обнаружил, что могу получить ссылку на NSMigrationManager, реализовав обратный вызов beginEntityMapping:manager:error: в моем пользовательском NSEntityMigrationPolicy, начав с наблюдения там.

Единственная проблема заключается в том, что к тому времени, когда вы получаете вызов beginEntityMapping, прогресс, кажется, достигает примерно 30% (кроме того, эти 30% обычно составляют половину общего времени, проведенного внутри вызов addPersistentStoreWithType, так что на самом деле это даже хуже, чем кажется).

Кто-нибудь еще знает о каких-либо хитростях, которые можно использовать для получения ссылки на NSMigrationManager чуть раньше в процессе, чтобы мне не пришлось упускать первую треть возможности дать отзыв пользователю о почему приложение так долго запускается?

Заранее спасибо за любую помощь!

Ответы [ 2 ]

0 голосов
/ 04 июня 2015

Вы можете сделать это с помощью кода, подобного следующему:

 NSMigrationManager *migrationManager = [[NSMigrationManager alloc] initWithSourceModel:sourceModel
                                                                      destinationModel:destinationModel];

//if it's set to NO, we can't migrate due to too much memory
//if it's set to YES (the default), we get no progress reporting!!
//migrationManager.usesStoreSpecificMigrationManager = NO;

NSError *mappingError;
NSMappingModel *mappingModel = [NSMappingModel inferredMappingModelForSourceModel:sourceModel
                                                                 destinationModel:destinationModel
                                                                            error:&mappingError];

NSPersistentStore *persistentStore;
NSError *addPersistentStoreError;
if (mappingModel) {

    NSError *migrationError;
    BOOL migrationSuccess = [migrationManager migrateStoreFromURL:sourceStoreURL
                                                             type:NSSQLiteStoreType
                                                          options:nil
                                                 withMappingModel:mappingModel
                                                 toDestinationURL:destinationStoreURL
                                                  destinationType:NSSQLiteStoreType
                                               destinationOptions:nil error:&migrationError];

Но обратите особое внимание на -usesStoreSpecificMigrationManager

Если это ДА (что вы действительно хотите, чтобы миграция была намного проще), вы не получите никаких обновлений прогресса, что является худшим уловом-22 за всю историю: (

0 голосов
/ 07 февраля 2011

После нескольких недель взлома вокруг этой проблемы, он не смог найти никакого способа для достижения этой цели и просто прекратил использовать addPersistentStoreWithType:configuration:URL:options:error: в целом и вручную запустил миграцию согласно документации .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...