0

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

2 回答 2

4

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

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

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

更新 2

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

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

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

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

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

更新 3

  1. 在仪器中对此进行分析。这会告诉你慢在哪里。
  2. 做什么dataToMigrate = [self fetchSomeDataFromDatabase];

查看您的时间档案,这将告诉您什么是慢的。把仪器的时间曲线发给我,我也会看看。

于 2012-11-11T18:21:38.913 回答
0

代码很简单:

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

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

于 2012-11-11T18:59:58.557 回答