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

时间:2012-11-11 16:54:41

标签: ios core-data

我有一个应用程序,可以在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:]

2 个答案:

答案 0 :(得分:4)

badfood是一种常见的发射崩溃。您需要从主线程创建Core Data堆栈。我在这里和过去的其他地方已经讨论了几次。

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

请注意,您的应用需要能够在没有堆栈的情况下启动。对于现有应用程序,这可能是一个重大变化。

更新2

这已推荐始终但不幸的是,最近才开始在模板中显示。

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

  1. 如果要将数据库从一个版本迁移到另一个版本;将存储添加到协调器时会发生迁移。
  2. 如果您要将iCloud添加到您的应用程序中,首次启动时会显着
  3. 如果核心数据确定需要对数据库进行维护,则可能需要比预期更长的时间。
  4. “正确”的答案是将商店添加到主线程的协调器中。

    快速/快速回答是打开核心数据的sql日志记录,然后查看启动过程中发生了什么。一旦你了解导致延迟的原因,你就可以解决它。如果是迁移,那么正确答案可能是唯一的答案。

    更新3

    1. 在乐器中对此进行分析。那将告诉你缓慢的地方。
    2. dataToMigrate = [self fetchSomeDataFromDatabase];做什么?
    3. 查看你的时间档案,这会告诉你什么是慢的。发给我仪器的时间曲线,我也会看一下。

答案 1 :(得分:0)

代码很简单:

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

但正如马库斯所说,请确保您的应用可以处理启动时没有准备好CoreData(现在它是异步的)。设置一个闪屏!? /一个不使用db的基本菜单