轻量级迁移/ addPersistentStoreWithType会挂起应用程序启动吗?

时间:2013-08-13 18:27:40

标签: ios objective-c core-data

几十个iOS 6用户看到了一个问题,其中addPersistentStoreWithType似乎挂起了应用程序,但似乎并没有影响成千上万的其他活跃用户。谷歌搜索和搜索开发论坛还没有帮助。我打电话给这个,应用程序只是为一些用户挂起。

options = @{NSMigratePersistentStoresAutomaticallyOption:@YES, NSInferMappingModelAutomaticallyOption: @YES, NSPersistentStoreFileProtectionKey: NSFileProtectionCompleteUnlessOpen};
[self.persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&addPersistentStoreError];

我没有在文档中看到任何表明这可能会引发异常的内容,或者为什么它会因任何原因而死锁/挂起。这些用户每次启动都会反复发生这种情况,从而阻止用户启动应用程序(重新安装)。我们得到的崩溃日志都有异常代码0x000000008badf00d(导致主线程需要太长时间的任何东西)。

什么可能导致addPersistenStoreWithType像这样挂起?

2 个答案:

答案 0 :(得分:1)

我也面临同样的问题。用户拥有非常庞大的数据。我的应用程序冻结了addPersistentStoreWithType方法。具体来说,我在iPad2中面临这个问题。在iPad3中,数据迁移工作完美无缺。我们在高优先级线程中添加了持久性存储,并在迁移发生时为用户显示了一些内容。

(void)performLightweightMigrationInBackgroundWithStoreURL:(NSURL *)storeURL
 {
    [self.initializerDelegate willStartMigration];
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^(void){
        NSDictionary *storeOptions = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];

        NSError *error = nil;
        if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:storeOptions error:&error]) {
            dispatch_async(dispatch_get_main_queue(), ^(void){
               // we showed an alert message for migration failure
            });
        } else {
            dispatch_async(dispatch_get_main_queue(), ^(void){
                // we showed an alert message for successful migration
            });
        }
    });
}

答案 1 :(得分:0)

如果您正在处理要迁移的潜在大型数据库,我建议您确保在-applicationDidFinishLaunching:中避免初始化持久性存储(并运行迁移),因为您只需几秒钟即可完成在iOS杀死它之前在该方法中设置的应用程序。那里没有太多的空间。

相反,启动应用,显示微调器或其他指示您正在初始视图控制器上加载内容,然后在从-applicationDidFinishLaunching:返回-performSelector:withObject:afterDelay:后加载商店延迟0或类似。