几十个iOS 6用户看到了一个问题,其中addPersistentStoreWithType似乎挂起了应用程序,但似乎并没有影响成千上万的其他活跃用户。谷歌搜索和搜索开发论坛还没有帮助。我打电话给这个,应用程序只是为一些用户挂起。
options = @{NSMigratePersistentStoresAutomaticallyOption:@YES, NSInferMappingModelAutomaticallyOption: @YES, NSPersistentStoreFileProtectionKey: NSFileProtectionCompleteUnlessOpen};
[self.persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&addPersistentStoreError];
我没有在文档中看到任何表明这可能会引发异常的内容,或者为什么它会因任何原因而死锁/挂起。这些用户每次启动都会反复发生这种情况,从而阻止用户启动应用程序(重新安装)。我们得到的崩溃日志都有异常代码0x000000008badf00d(导致主线程需要太长时间的任何东西)。
什么可能导致addPersistenStoreWithType像这样挂起?
答案 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或类似。