核心数据:在应用程序启动时超时添加持久性存储

我有一个应用程序,在application:didFinishLaunchingWithOptions程序中创build一个持久存储application:didFinishLaunchingWithOptions 。 添加商店显然可能需要很长时间,这会导致iOS在完成启动之前终止应用程序。 超时时间的堆栈跟踪看起来像这样。 有谁知道如何防止这种情况发生?

 Exception Type: 00000020 Exception Codes: 0x000000008badf00d Highlighted Thread: 0 Application Specific Information: com.foo.bar failed to launch in time Elapsed total CPU time (seconds): 23.490 (user 23.490, system 0.000), 78% CPU Elapsed application CPU time (seconds): 8.406, 28% CPU Thread 0 name: Dispatch queue: com.apple.main-thread Thread 0: 0 libsystem_kernel.dylib 0x31b8939c pread + 20 1 libsqlite3.dylib 0x31ed95d0 unixRead 2 libsqlite3.dylib 0x31eec106 readDbPage 3 libsqlite3.dylib 0x31eeb2a2 sqlite3PagerAcquire 4 libsqlite3.dylib 0x31f04096 moveToChild 5 libsqlite3.dylib 0x31f052c6 sqlite3BtreeNext 6 libsqlite3.dylib 0x31f01490 sqlite3VdbeExec 7 libsqlite3.dylib 0x31efa48a sqlite3_step 8 CoreData 0x364f8892 _execute 9 CoreData 0x364f878c -[NSSQLiteConnection execute] 10 CoreData 0x3658bd94 -[NSSQLConnection prepareAndExecuteSQLStatement:] 11 CoreData 0x365dd4f2 -[_NSSQLiteStoreMigrator performMigration:] 12 CoreData 0x365d70dc -[NSSQLiteInPlaceMigrationManager migrateStoreFromURL:type:options:withMappingModel:toDestinationURL:destinationType:destinationOptions:error:] 13 CoreData 0x36577428 -[NSMigrationManager migrateStoreFromURL:type:options:withMappingModel:toDestinationURL:destinationType:destinationOptions:error:] 14 CoreData 0x365c8670 -[NSStoreMigrationPolicy(InternalMethods) migrateStoreAtURL:toURL:storeType:options:withManager:error:] 15 CoreData 0x365c79c4 -[NSStoreMigrationPolicy migrateStoreAtURL:withManager:metadata:options:error:] 16 CoreData 0x365c8ece -[NSStoreMigrationPolicy(InternalMethods) _gatherDataAndPerformMigration:] 17 CoreData 0x364ec3b0 -[NSPersistentStoreCoordinator addPersistentStoreWithType:configuration:URL:options:error:] 

badfood是一个常见的发射崩溃。 您需要从主线程创build核心数据堆栈。 我曾经在这里和其他地方多次讨论过这个问题。

您也可以看看Aplle的iCloud Core Datavidros,因为启动代码也可以解决您的问题。

请记住,您的应用程序将需要能够启动没有堆栈就位。 对于现有的应用程序,这可能是一个重大变化

更新2

一直是build议,但不幸的是,直到最近它才开始在模板中显示。

有几件事情可能会导致添加持久性存储需要更长的时间:

  1. 如果您将数据库从一个版本迁移到另一个版本, 当您将商店添加到协调员时,迁移就会发生。
  2. 如果您将iCloud添加到您的应用程序中,则首次启动时需要更长的时间。
  3. 如果Core Data确定需要对数据库进行维护,则可能需要比预期更长的时间。

“正确的”答案是将商店添加到主线程的协调器。

快速/ bandaid的答案是打开核心数据的SQL日志,然后看看发生了什么事情。 一旦你明白是什么造成了延误,你可能可以解决这个问题。 如果是移民,那么正确的答案可能是唯一的答案。

更新3

  1. 在仪器中进行分析。 这会告诉你缓慢的地方。
  2. dataToMigrate = [self fetchSomeDataFromDatabase]; 做?

看看你的时间档案,这将告诉你什么是缓慢的。 给我发送来自乐器的时间档案,我也会看一下。

代码很简单:

  dispatch_async(DISPATCH_QUEUE_PRIORITY_HIGH, ^{ [self setupCoreDataStack]; //TODO }) 

但正如马库斯所说,确保你的应用程序可以处理没有启动CoreData(现在是asynchronous)..你可以设置一个闪屏!? /不使用数据库的基本菜单