我正在Swift构建一个相机应用程序,即将发布它的新版本。有些用户报告应用程序在启动时崩溃,而且在该应用程序中批量删除旧图片时也遇到了同样的问题。
基本上,当商店协调员试图保存数据库时,它会崩溃。所有正常操作,在我的情况下,包括添加和浏览图片工作正常,但"更大的对象和#34; (删除一半图片或将商店迁移到较新版本)会导致崩溃。它不是迁移本身,因为它适用于非破坏数据。
我的假设是,在使用过程中,旧商店被破坏了 - 我为什么以及如何只能推测它。也许是因为应用程序有错误或可能是因为用户在错误的时刻刷掉了应用程序。该应用程序处理相当大的数据集,我很难在正确的时刻保存数据。太早了,它影响了用户界面,太晚了,所需的信息,即来自gps,还没有,我冒着失去它或堆积内存中未保存的数据的风险,当应用程序终止时,我无法快速保存。
以下是启动新版本的堆栈跟踪,这是由一个简单的商店迁移引起的:
Thread 0 name: Dispatch queue: NSPersistentStoreCoordinator 0x17007db40
Thread 0 Crashed:
0 libsystem_kernel.dylib 0x0000000186e72c14 write + 8
1 libcopyfile.dylib 0x0000000186ce0d7c copyfile_internal + 1492
2 libcopyfile.dylib 0x0000000186ce35d4 copyfile + 4580
3 Foundation 0x0000000188983910 -[NSFilesystemItemCopyOperation _handleFTSEntry:] + 428
4 Foundation 0x0000000188982eb0 -[NSDirectoryTraversalOperation main] + 272
5 Foundation 0x00000001888e50a4 -[__NSOperationInternal _start:] + 620
6 Foundation 0x000000018897f728 -[NSFileManager copyItemAtPath:toPath:options:error:] + 268
7 Foundation 0x000000018897f928 -[NSFileManager copyItemAtURL:toURL:options:error:] + 416
8 CoreData 0x000000018a2c6a90 +[NSSQLCore _replacePersistentStoreAtURL:destinationOptions:withPersistentStoreFromURL:sourceOptions:error:] + 768
9 CoreData 0x000000018a2ad7f8 __182-[NSPersistentStoreCoordinator(_NSPersistentStoreCoordinatorPrivateMathods) _replacePersistentStoreAtURL:destinationOptions:withPersistentStoreFromURL:sourceOptions:storeType:error:]_block_invoke + 480
10 CoreData 0x000000018a2af3d8 gutsOfBlockToNSPersistentStoreCoordinatorPerform + 168
11 CoreData 0x000000018a29e890 _perform + 220
12 CoreData 0x000000018a2ad524 -[NSPersistentStoreCoordinator(_NSPersistentStoreCoordinatorPrivateMathods) _replacePersistentStoreAtURL:destinationOptions:withPersistentStoreFromURL:sourceOptions:storeType:error:] + 256
13 CoreData 0x000000018a307d74 -[NSStoreMigrationPolicy(InternalMethods) _gatherDataAndPerformMigration:] + 2804
14 CoreData 0x000000018a2a2f08 __91-[NSPersistentStoreCoordinator addPersistentStoreWithType:configuration:URL:options:error:]_block_invoke + 4764
15 CoreData 0x000000018a2af3d8 gutsOfBlockToNSPersistentStoreCoordinatorPerform + 168
16 libdispatch.dylib 0x0000000186d4a1bc _dispatch_client_callout + 16
17 libdispatch.dylib 0x0000000186d577f0 _dispatch_barrier_sync_f_invoke + 84
18 CoreData 0x000000018a29e87c _perform + 200
19 CoreData 0x000000018a1b0470 -[NSPersistentStoreCoordinator addPersistentStoreWithType:configuration:URL:options:error:] + 388
20 KameraPROD 0x00000001000e1244 specialized DataController.(persistentStoreCoordinator.getter).(closure #1) (DataController.swift:36)
21 KameraPROD 0x00000001000e47dc AppDelegate.init() -> AppDelegate (DataController.swift:48)
22 UIKit 0x000000018e0005a4 _UIApplicationMainPreparations + 1880
23 UIKit 0x000000018dddc500 UIApplicationMain + 156
24 KameraPROD 0x000000010006e160 main (AppDelegate.swift:5)
25 libdyld.dylib 0x0000000186d7d5b8 start + 4
iOS:10.3(14E5277a)
Xcode 8.3 beta 4
硬件:iPhone 6s
这是堆栈跟踪第20行的代码:
lazy var managedObjectContext: NSManagedObjectContext = {
let coordinator = self.persistentStoreCoordinator
var managedObjectContext = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
managedObjectContext.persistentStoreCoordinator = coordinator
return managedObjectContext
}()
我正在寻找:
1)避免这种腐败的策略 2)修复它的方法
感谢任何见解 安德烈亚斯