当我尝试将新对象保存到核心数据中时,出现此错误并在尝试保存上下文时崩溃:
libc++abi.dylib: terminating with uncaught exception of type NSException
我已经使用相同的方法将新创建的托管对象保存在许多其他 View Controller 中,并且除此之外都工作正常。当我更改此行时问题开始了:
var managedObjectContext = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)
来自 AppDelegate 中的 .mainQueueConcurrencyType。
这是我在 AppDel 中的持久存储协调器设置:
lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator = {
// The persistent store coordinator for the application. This implementation creates and returns a coordinator, having added the store for the application to it. This property is optional since there are legitimate error conditions that could cause the creation of the store to fail.
// Create the coordinator and store
let coordinator = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel)
let url = self.applicationDocumentsDirectory.appendingPathComponent("SingleViewCoreData.sqlite")
let options = [NSMigratePersistentStoresAutomaticallyOption: true, NSInferMappingModelAutomaticallyOption: true]
var failureReason = "There was an error creating or loading the application's saved data."
do {
try coordinator.addPersistentStore(ofType: NSSQLiteStoreType, configurationName: nil, at: url, options: options)
} catch {
// Report any error we got.
var dict = [String: AnyObject]()
dict[NSLocalizedDescriptionKey] = "Failed to initialize the application's saved data" as AnyObject?
dict[NSLocalizedFailureReasonErrorKey] = failureReason as AnyObject?
dict[NSUnderlyingErrorKey] = error as NSError
let wrappedError = NSError(domain: "YOUR_ERROR_DOMAIN", code: 9999, userInfo: dict)
// Replace this with code to handle the error appropriately.
// abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
NSLog("Unresolved error \(wrappedError), \(wrappedError.userInfo)")
abort()
}
return coordinator
}()
这是导致崩溃的一系列函数:
//get a new model for the components, same context, new FRC
purchaseOrderModel = StockModel()
purchaseOrderModel.setupManagedObjectContext()
purchaseOrderModel.tableView = tableView
if purchaseOrder == nil {
//delegate?.editModeStateChange(editing: true)
purchaseOrder = purchaseOrderModel.savePurchaseOrderWith("", supplier: nil, issueDate: Date(), deliveryDate: Date(), deliveryStatus: false)
delegate?.newItemAdded()
creatingNewPurchaseOrder = true
}
调用
func savePurchaseOrderWith(_ poId: String?, supplier: NSManagedObject?, issueDate: Date, deliveryDate: Date, deliveryStatus: Bool? = nil) -> NSManagedObject {
let newPurchaseOrder = NSEntityDescription.insertNewObject(forEntityName: "Purchase_Order", into: context)
newPurchaseOrder.setValue(poId, forKey: "po_id")
newPurchaseOrder.setValue(issueDate, forKey: "issue_date")
newPurchaseOrder.setValue(deliveryDate, forKey: "est_delivery_date")
newPurchaseOrder.setValue(supplier, forKey: "supplier")
newPurchaseOrder.setValue(deliveryStatus, forKey: "delivered")
_ = doSaveContext()
return newPurchaseOrder
}
doSaveContext:
func doSaveContext() -> Bool {
do {
try context.save() //editing POs makes it crash here after changing the created context in app delegate
return true
} catch let error as NSError {
print("Error saving context after delete \(error.localizedDescription)")
return false
}
}
我在 try context.save()
我在这个项目上工作已经有几个月了,但这是地面开发停止的原因,所以帮助会很大。奇怪的是,所有其他创建以 doSaveContext() 结尾的新空对象(比如交付、新产品等)的路径都可以正常工作。
乐于发布额外信息等
更新 1:添加异常断点时,它会在我的模型类的这个函数中中断:
func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChange anObject: Any, at indexPath: IndexPath?, for type: NSFetchedResultsChangeType, newIndexPath: IndexPath?) {
switch type{
case NSFetchedResultsChangeType.insert:
//note that for insert we insert a row at _newIndexPath_
if let insertIndexPath = newIndexPath {
self.tableView.insertRows(at: [insertIndexPath], with: UITableViewRowAnimation.fade)
}
case NSFetchedResultsChangeType.delete:
//note that for delete we delete the row at _indexPath_
if let deleteIndexPath = indexPath {
self.tableView.deleteRows(at: [deleteIndexPath], with: UITableViewRowAnimation.fade)
}
case NSFetchedResultsChangeType.update:
//note that for update we update the row at _indexPath_
if indexPath != nil {
// let cell = self.tableView.cellForRowAtIndexPath(updateIndexPath)
// let supplier = fetchedResultsController.objectAtIndexPath(updateIndexPath)
// cell!.textLabel?.text = supplier.name
}
case NSFetchedResultsChangeType.move:
//note that for Move we delete the row at _indexPath_
if let deleteIndexPath = indexPath {
self.tableView.insertRows(at: [deleteIndexPath], with: UITableViewRowAnimation.fade)
}
//note that for move we insert a row at _newIndexPath_
if let insertIndexPath = newIndexPath {
self.tableView.insertRows(at: [insertIndexPath], with: UITableViewRowAnimation.fade)
}
}
}
在 self.tableView.insertRows(at: [insertIndexPath], with: UITableViewRowAnimation.fade) 行上(如果有帮助的话)。在任何地方都找不到清晰的日志。
更新 2:当控制台中断时在控制台中键入 bt 会产生以下结果:
(lldb) bt
* thread #1, queue = 'NSManagedObjectContext 0x6040003cb8b0', stop reason = breakpoint 1.2
frame #0: 0x000000010c8e3b86 libc++abi.dylib`__cxa_throw
frame #1: 0x0000000106ee2068 libobjc.A.dylib`objc_exception_throw + 343
frame #2: 0x0000000107ff8362 CoreFoundation`+[NSException raise:format:arguments:] + 98
frame #3: 0x0000000106986089 Foundation`-[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 193
frame #4: 0x00000001096d9430 UIKit`-[UITableView _endCellAnimationsWithContext:] + 18124
frame #5: 0x00000001096f5524 UIKit`-[UITableView _updateRowsAtIndexPaths:withUpdateAction:rowAnimation:usingPresentationValues:] + 1342
frame #6: 0x00000001096f55f7 UIKit`-[UITableView insertRowsAtIndexPaths:withRowAnimation:] + 118
* frame #7: 0x00000001062013fd SC Dev`StockModel.controller(controller=0x00006000000efe00, anObject=Any @ 0x00007fff59ae7458, indexPath=nil, type=insert, newIndexPath=2 indices, self=0x0000600000478940) at StockModel.swift:283
frame #8: 0x0000000106201f30 SC Dev`@objc StockModel.controller(_:didChange:at:for:newIndexPath:) at StockModel.swift:0
frame #9: 0x0000000107b6ef17 CoreData`__82-[NSFetchedResultsController(PrivateMethods) _core_managedObjectContextDidChange:]_block_invoke + 5767
frame #10: 0x0000000107a13bf8 CoreData`developerSubmittedBlockToNSManagedObjectContextPerform + 168
frame #11: 0x000000010cccb43c libdispatch.dylib`_dispatch_client_callout + 8
frame #12: 0x000000010ccd2338 libdispatch.dylib`_dispatch_queue_barrier_sync_invoke_and_complete + 392
frame #13: 0x0000000107a13afe CoreData`-[NSManagedObjectContext performBlockAndWait:] + 286
frame #14: 0x0000000107b6d877 CoreData`-[NSFetchedResultsController(PrivateMethods) _core_managedObjectContextDidChange:] + 119
frame #15: 0x0000000107f8f07c CoreFoundation`__CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER__ + 12
frame #16: 0x0000000107f8ef7a CoreFoundation`_CFXRegistrationPost + 442
frame #17: 0x0000000107f8ecc2 CoreFoundation`___CFXNotificationPost_block_invoke + 50
frame #18: 0x0000000107f50a32 CoreFoundation`-[_CFXNotificationRegistrar find:object:observer:enumerator:] + 1826
frame #19: 0x0000000107f4fbac CoreFoundation`_CFXNotificationPost + 652
frame #20: 0x00000001068c3842 Foundation`-[NSNotificationCenter postNotificationName:object:userInfo:] + 66
frame #21: 0x00000001079fcbd5 CoreData`-[NSManagedObjectContext(_NSInternalNotificationHandling) _postObjectsDidChangeNotificationWithUserInfo:] + 773
frame #22: 0x0000000107a9e0ca CoreData`-[NSManagedObjectContext(_NSInternalChangeProcessing) _createAndPostChangeNotification:deletions:updates:refreshes:deferrals:wasMerge:] + 1658
frame #23: 0x00000001079f6f0f CoreData`-[NSManagedObjectContext(_NSInternalChangeProcessing) _processRecentChanges:] + 2399
frame #24: 0x00000001079fa7d3 CoreData`-[NSManagedObjectContext save:] + 419
frame #25: 0x00000001062032fc SC Dev`StockModel.doSaveContext(self=0x0000600000673000) at StockModel.swift:381
frame #26: 0x000000010620affd SC Dev`StockModel.savePurchaseOrderWith(poId="", supplier=nil, issueDate=2018-02-06 21:17:37 UTC, deliveryDate=2018-02-06 21:17:37 UTC, deliveryStatus=false, self=0x0000600000673000) at StockModel.swift:592
frame #27: 0x000000010626ce76 SC Dev`PurchaseOrderDetailViewController.viewDidLoad(self=0x00007f941e038800) at PurchaseOrderDetailViewController.swift:68
frame #28: 0x0000000106270f84 SC Dev`@objc PurchaseOrderDetailViewController.viewDidLoad() at PurchaseOrderDetailViewController.swift:0
frame #29: 0x000000010975ad51 UIKit`-[UIViewController loadViewIfRequired] + 1235
frame #30: 0x00000001097a24dc UIKit`-[UINavigationController _updateScrollViewFromViewController:toViewController:] + 68
frame #31: 0x00000001097a2818 UIKit`-[UINavigationController _startTransition:fromViewController:toViewController:] + 153
frame #32: 0x00000001097a392f UIKit`-[UINavigationController _startDeferredTransitionIfNeeded:] + 841
frame #33: 0x00000001097a4b90 UIKit`-[UINavigationController __viewWillLayoutSubviews] + 115
frame #34: 0x00000001099fb2ae UIKit`-[UILayoutContainerView layoutSubviews] + 231
frame #35: 0x000000010968b551 UIKit`-[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 1331
frame #36: 0x00000001093fb4ba QuartzCore`-[CALayer layoutSublayers] + 153
frame #37: 0x00000001093ff5a9 QuartzCore`CA::Layer::layout_if_needed(CA::Transaction*) + 401
frame #38: 0x00000001093881cd QuartzCore`CA::Context::commit_transaction(CA::Transaction*) + 365
frame #39: 0x00000001093b3ae4 QuartzCore`CA::Transaction::commit() + 500
frame #40: 0x00000001095e7687 UIKit`_afterCACommitHandler + 272
frame #41: 0x0000000107f95db7 CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 23
frame #42: 0x0000000107f95d0e CoreFoundation`__CFRunLoopDoObservers + 430
frame #43: 0x0000000107f7a324 CoreFoundation`__CFRunLoopRun + 1572
frame #44: 0x0000000107f79a89 CoreFoundation`CFRunLoopRunSpecific + 409
frame #45: 0x000000010f6de9c6 GraphicsServices`GSEventRunModal + 62
frame #46: 0x00000001095bcd30 UIKit`UIApplicationMain + 159
frame #47: 0x0000000106142607 SC Dev`main at AppDelegate.swift:18
frame #48: 0x000000010cd47d81 libdyld.dylib`start + 1
更新 3:将 _ = doSaveContext() 包装在 DispatchQueue.main.async { 中让我更进一步,但仍然在同一个表插入行上中断和以前一样使用以下日志。
bt
* thread #1, queue = 'NSManagedObjectContext 0x6000001da400', stop reason = breakpoint 1.1
frame #0: 0x000000010945bf11 libobjc.A.dylib`objc_exception_throw
frame #1: 0x000000010a572362 CoreFoundation`+[NSException raise:format:arguments:] + 98
frame #2: 0x0000000108f00089 Foundation`-[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 193
frame #3: 0x000000010b9e0430 UIKit`-[UITableView _endCellAnimationsWithContext:] + 18124
frame #4: 0x000000010b9fc524 UIKit`-[UITableView _updateRowsAtIndexPaths:withUpdateAction:rowAnimation:usingPresentationValues:] + 1342
frame #5: 0x000000010b9fc5f7 UIKit`-[UITableView insertRowsAtIndexPaths:withRowAnimation:] + 118
* frame #6: 0x000000010877a0cd SC Dev`StockModel.controller(controller=0x00006000000fea00, anObject=Any @ 0x00007fff575731c8, indexPath=nil, type=insert, newIndexPath=2 indices, self=0x000060400046aa00) at StockModel.swift:283
frame #7: 0x000000010877ac00 SC Dev`@objc StockModel.controller(_:didChange:at:for:newIndexPath:) at StockModel.swift:0
frame #8: 0x000000010a0e8f17 CoreData`__82-[NSFetchedResultsController(PrivateMethods) _core_managedObjectContextDidChange:]_block_invoke + 5767
frame #9: 0x0000000109f8dbf8 CoreData`developerSubmittedBlockToNSManagedObjectContextPerform + 168
frame #10: 0x000000010f23843c libdispatch.dylib`_dispatch_client_callout + 8
frame #11: 0x000000010f23f338 libdispatch.dylib`_dispatch_queue_barrier_sync_invoke_and_complete + 392
frame #12: 0x0000000109f8dafe CoreData`-[NSManagedObjectContext performBlockAndWait:] + 286
frame #13: 0x000000010a0e7877 CoreData`-[NSFetchedResultsController(PrivateMethods) _core_managedObjectContextDidChange:] + 119
frame #14: 0x000000010a50907c CoreFoundation`__CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER__ + 12
frame #15: 0x000000010a508f7a CoreFoundation`_CFXRegistrationPost + 442
frame #16: 0x000000010a508cc2 CoreFoundation`___CFXNotificationPost_block_invoke + 50
frame #17: 0x000000010a4caa32 CoreFoundation`-[_CFXNotificationRegistrar find:object:observer:enumerator:] + 1826
frame #18: 0x000000010a4c9bac CoreFoundation`_CFXNotificationPost + 652
frame #19: 0x0000000108e3d842 Foundation`-[NSNotificationCenter postNotificationName:object:userInfo:] + 66
frame #20: 0x0000000109f76bd5 CoreData`-[NSManagedObjectContext(_NSInternalNotificationHandling) _postObjectsDidChangeNotificationWithUserInfo:] + 773
frame #21: 0x000000010a0180ca CoreData`-[NSManagedObjectContext(_NSInternalChangeProcessing) _createAndPostChangeNotification:deletions:updates:refreshes:deferrals:wasMerge:] + 1658
frame #22: 0x0000000109f70f0f CoreData`-[NSManagedObjectContext(_NSInternalChangeProcessing) _processRecentChanges:] + 2399
frame #23: 0x0000000109f747d3 CoreData`-[NSManagedObjectContext save:] + 419
frame #24: 0x000000010877bfcc SC Dev`StockModel.doSaveContext(self=0x000060000046fec0) at StockModel.swift:381
frame #25: 0x0000000108783ebe SC Dev`closure #1 in StockModel.savePurchaseOrderWith(self=0x000060000046fec0) at StockModel.swift:593
frame #26: 0x0000000108783f52 SC Dev`partial apply for closure #1 in StockModel.savePurchaseOrderWith(_:supplier:issueDate:deliveryDate:deliveryStatus:) at StockModel.swift:0
frame #27: 0x00000001086c0b89 SC Dev`thunk for @callee_owned () -> () at AddProductViewController.swift:0
frame #28: 0x000000010f2373f7 libdispatch.dylib`_dispatch_call_block_and_release + 12
frame #29: 0x000000010f23843c libdispatch.dylib`_dispatch_client_callout + 8
frame #30: 0x000000010f2436f0 libdispatch.dylib`_dispatch_main_queue_callback_4CF + 628
frame #31: 0x000000010a52fef9 CoreFoundation`__CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 9
frame #32: 0x000000010a4f4662 CoreFoundation`__CFRunLoopRun + 2402
frame #33: 0x000000010a4f3a89 CoreFoundation`CFRunLoopRunSpecific + 409
frame #34: 0x0000000111c579c6 GraphicsServices`GSEventRunModal + 62
frame #35: 0x000000010b8c3d30 UIKit`UIApplicationMain + 159
frame #36: 0x00000001086bb2d7 SC Dev`main at AppDelegate.swift:18
frame #37: 0x000000010f2b4d81 libdyld.dylib`start + 1
(lldb)
最佳答案
无法确定,但您的堆栈跟踪强烈表明问题与从 NSFetchedResultsControllerDelegate 回调更新您的 TableView 有关。根据您的一条评论,最可能的原因是您没有在任何地方的 TableView 上调用 beginUpdates()。
从 NSFetchedResultsControllerDelegate 更新 TableView 有两种基本方法。首先,简单但不是最佳:不要实现 controllerWillChangeContent(_:) 或 controller(_:didChange:at:for:newIndexPath:)。 执行实现controllerDidChangeContent(_:),但使用该方法在 TableView 上reloadData()。不要为开始/结束更新或插入/删除/等行而烦恼。
第二个更好但稍微复杂一些,是执行所有这些操作:
controllerWillChangeContent(_:) 并使用它调用 beginUpdates()。controller(_:didChange:at:for:newIndexPath:) 以在表中插入/更新/等行。controllerDidChangeContent(_:) 并使用它调用 endUpdates()。“开始”和“结束”调用都很重要。我不能 100% 确定这是导致您的特定崩溃的原因,但我希望遗漏 beginUpdates() 会导致某种崩溃。
关于ios - libc++abi.dylib 核心数据崩溃 : terminating with uncaught exception of type NSException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48651308/
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下
我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的
如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:
1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里
我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我
print"Enteryourpassword:"pass=STDIN.noecho(&:gets)puts"Yourpasswordis#{pass}!"输出:Enteryourpassword:input.rb:2:in`':undefinedmethod`noecho'for#>(NoMethodError) 最佳答案 一开始require'io/console'后来的Ruby1.9.3 关于ruby-为什么不能使用类IO的实例方法noecho?,我们在StackOverflow上
我刚刚安装了带有RVM的Ruby2.2.0,并尝试使用它得到了这个:$rvmuse2.2.0--defaultUsing/Users/brandon/.rvm/gems/ruby-2.2.0dyld:Librarynotloaded:/usr/local/lib/libgmp.10.dylibReferencedfrom:/Users/brandon/.rvm/rubies/ruby-2.2.0/bin/rubyReason:Incompatiblelibraryversion:rubyrequiresversion13.0.0orlater,butlibgmp.10.dylibpro
我有一个数组数组,想将元素附加到子数组。+=做我想做的,但我想了解为什么push不做。我期望的行为(并与+=一起工作):b=Array.new(3,[])b[0]+=["apple"]b[1]+=["orange"]b[2]+=["frog"]b=>[["苹果"],["橙子"],["Frog"]]通过推送,我将推送的元素附加到每个子数组(为什么?):a=Array.new(3,[])a[0].push("apple")a[1].push("orange")a[2].push("frog")a=>[[“苹果”、“橙子”、“Frog”]、[“苹果”、“橙子”、“Frog”]、[“苹果”、“
有没有办法让Ruby能够做这样的事情?classPlane@moved=0@x=0defx+=(v)#thisiserror@x+=v@moved+=1enddefto_s"moved#{@moved}times,currentxis#{@x}"endendplane=Plane.newplane.x+=5plane.x+=10putsplane.to_s#moved2times,currentxis15 最佳答案 您不能在Ruby中覆盖复合赋值运算符。任务在内部处理。您应该覆盖+,而不是+=。plane.a+=b与plane.a=