我有一个应用程序,可以在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:]
答案 0 :(得分:4)
badfood是一种常见的发射崩溃。您需要从主线程创建Core Data堆栈。我在这里和过去的其他地方已经讨论了几次。
您还可以查看Aplle的iCloud Core Datavidros,因为该启动代码也可以解决您的问题。
请注意,您的应用需要能够在没有堆栈的情况下启动。对于现有应用程序,这可能是一个重大变化。
这已推荐始终但不幸的是,最近才开始在模板中显示。
有几件事可能会导致持久存储的添加需要更长的时间:
“正确”的答案是将商店添加到主线程的协调器中。
快速/快速回答是打开核心数据的sql日志记录,然后查看启动过程中发生了什么。一旦你了解导致延迟的原因,你就可以解决它。如果是迁移,那么正确答案可能是唯一的答案。
dataToMigrate = [self fetchSomeDataFromDatabase];
做什么?查看你的时间档案,这会告诉你什么是慢的。发给我仪器的时间曲线,我也会看一下。
答案 1 :(得分:0)
代码很简单:
dispatch_async(DISPATCH_QUEUE_PRIORITY_HIGH, ^{
[self setupCoreDataStack]; //TODO
})
但正如马库斯所说,请确保您的应用可以处理启动时没有准备好CoreData(现在它是异步的)。设置一个闪屏!? /一个不使用db的基本菜单