0

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

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

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

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

4

2 回答 2

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
            });
        }
    });
}
于 2013-12-04T04:28:20.837 回答
0

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

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

于 2013-08-13T19:12:01.680 回答