2011-01-18 8 views
2

데이터가 많은 앱이 있으며 Xcode의 시각적 매핑 모델과 정리 코드의 NSEntityMigrationPolicy 구현을 사용하여 모든 CoreData 마이그레이션 작업을 구현했습니다. 실제로 실제 장치에서의 마이그레이션은 실제로 길기 때문에 완료하는 데 최대 5 분이 소요될 수 있습니다.자동 마이그레이션에서 NSMigrationManager에 대한 참조를 얻는 가장 빠른 방법은 무엇입니까?

이 일이 발생하면 사용자에게 피드백을주고 NSMigrationManager에서 KVO의 migrationProgress 속성을 원합니다. 그 트릭은 addPersistentStoreWithType:configuration:URL:options:error:은 마이그레이션이 필요하다고 판단되는 경우 NSMigrationManager에 대한 참조를 가져 오지 못한다는 것입니다.

내 관찰 NCDntityMigrationPolicy에 beginEntityMapping:manager:error: 콜백을 구현하여 NSMigrationManager에 대한 참조를 얻을 수 있음을 발견했습니다.

유일한 문제는, 당신은 beginEntityMapping 호출에 도착하는 시간으로 진행 또한,이 30 %가 일반적으로 전체 시간이 addPersistentStoreWithType에 호출 내에서 소비에 대한 절반을 대표하는 약 30 % (최대 것으로 보인다이다 그래서 실제로 보이는 것보다 훨씬 더 나쁜 것입니다).

NSMigrationManager에 대한 참조를 좀 더 일찍 처리하기 위해 사용할 수있는 트릭을 알고있는 사람은 누구나 사용자에게 피드백을 제공 할 수있는 기회의 첫 3 분의 1을 놓치지 않아도됩니다. 왜 앱이 시작하기까지 오랜 시간이 걸리는지?

미리 도움을 청하십시오!

답변

0

이 문제를 해결하기 위해 몇 주 동안 해킹을 시도했지만이를 달성 할 수있는 방법을 찾을 수 없었으며 the documentation에 따라 addPersistentStoreWithType:configuration:URL:options:error:을 수동으로 트리거링하여 사용을 중지했습니다.

+1

가벼운 마이그레이션을 통해 실제로 작동합니까? 추측 된 매핑을 사용하여 "수동"마이그레이션을 구현했으며, 사실상 가벼운 마이그레이션이지만, 진행 상황은 항상 유지됩니다. 0.0. (성공적인 mi 후에도 gration) –

+1

iOS 6에 대해서는 확실하지 않지만 iOS 5 및 이전 버전에서는 예를 들어 가벼운 마이그레이션으로 진행 상황에 대한 피드백을받지 못하는 것 같습니다. 꽤 나쁘고 최선의 방법은 사전에 프로파일 링을하고 DB의 크기를 기반으로 한 추정치를 얻은 다음 진행 상황을 시뮬레이션하여 다소 퍼지하는 것입니다. 그러나 그것은 실제 진전이 아니며 단지 예측 일뿐입니다. – glenc

+1

iOS6에서 테스트를 마쳤으며 NSMigrationManager를 사용하여 수동으로 마이그레이션을 트리거하면 "migrationProgress"는 항상 0.0입니다. "-addPersistentStoreWithType : ..."에 대해서는 확실하지 않지만이 경우 마이그레이션 관리자에 대한 참조를 실제로 얻을 수 없다는 것을 지적했습니다. –

0

당신은 다음과 같은 코드로 작업을 수행 할 수 있습니다

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]; 

을하지만 (당신이 정말로 훨씬 쉽게 마이그레이션을 할) YES의 경우 -usesStoreSpecificMigrationManager

을 특별히주의, 당신은 어떤을 얻을 (

관련 문제