Mea*_*her 9 xcode core-data ios swift
Xcode 7 beta 6和NSFetchedResultsController今天让我很头疼.如果我使用Xcode 6编译相同的(使用Swift 2修复)代码,程序可以在设备和模拟器(iOS 7,iOS8)上运行.但是,如果我使用Xcode 7 beta 6进行编译,则只要我更新Core Data,程序就会在设备(iOS 8.4)上崩溃,并显示以下错误消息.
我得到类似于下面的错误
CoreData:错误:严重的应用程序错误.在调用-controllerDidChangeContent:期间,从NSFetchedResultsController的委托中捕获到异常.无效更新:第0节中的行数无效.更新(2)后现有部分中包含的行数必须等于更新前该部分中包含的行数(2),加上或减去数字从该部分插入或删除的行(插入2个,删除1个)并加上或减去移入或移出该部分的行数(0移入,0移出).用户信息(null)
有时它会因为另一个错误而崩溃
从空闲列表中出列的无效指针***在malloc_error_break中设置断点以进行调试
//NSFetchedResultsController delegates
func controllerWillChangeContent(controller: NSFetchedResultsController) {
self.tableView.beginUpdates()
}
func controller(controller: NSFetchedResultsController, didChangeSection sectionInfo: NSFetchedResultsSectionInfo, atIndex sectionIndex: Int, forChangeType type: NSFetchedResultsChangeType) {
switch type {
case .Insert:
self.tableView.insertSections(NSIndexSet(index: sectionIndex), withRowAnimation: .Fade)
case .Delete:
self.tableView.deleteSections(NSIndexSet(index: sectionIndex), withRowAnimation: .Fade)
default:
return
}
}
func controller(controller: NSFetchedResultsController, didChangeObject anObject: AnyObject, atIndexPath indexPath: NSIndexPath?, forChangeType type: NSFetchedResultsChangeType, newIndexPath: NSIndexPath?) {
switch type {
case .Insert:
print("Insert New: \(newIndexPath) Old: \(indexPath)")
tableView.insertRowsAtIndexPaths([newIndexPath!], withRowAnimation: .Fade)
case .Delete:
print("Delete New: \(newIndexPath) Old: \(indexPath)")
tableView.deleteRowsAtIndexPaths([indexPath!], withRowAnimation: .Fade)
case .Update:
print("Update New: \(newIndexPath) Old: \(indexPath)")
tableView.reloadRowsAtIndexPaths([indexPath!], withRowAnimation: .Fade)
//self.configureCell(tableView.cellForRowAtIndexPath(indexPath!)!, atIndexPath: indexPath!)
case .Move:
print("Move New: \(newIndexPath) Old: \(indexPath)")
tableView.deleteRowsAtIndexPaths([indexPath!], withRowAnimation: .Fade)
tableView.insertRowsAtIndexPaths([newIndexPath!], withRowAnimation: .Fade)
}
}
func controllerDidChangeContent(controller: NSFetchedResultsController) {
self.tableView.endUpdates()
}
Run Code Online (Sandbox Code Playgroud)
对于.Update我也尝试打电话的部分
self.configureCell(tableView.cellForRowAtIndexPath(indexPath!)!, atIndexPath: indexPath!)
Run Code Online (Sandbox Code Playgroud)
配置单元格方法:
func configureCell(cell: UITableViewCell, atIndexPath indexPath: NSIndexPath) {
let object = self.fetchedResultsController.objectAtIndexPath(indexPath) as! Person
//etc
}
Run Code Online (Sandbox Code Playgroud)
排序描述符
let sortDescriptor = NSSortDescriptor(key: "date", ascending: false)
fetchRequest.sortDescriptors = [sortDescriptor]
Run Code Online (Sandbox Code Playgroud)
程序总是崩溃.只有这样才能以某种方式阻止这个问题,将delagete设置为nil,更新对象并将delagate设置回自己.
这是一个错误吗?如果不是,我该如何防止这种情况?谢谢
一些错误报告具有相同/类似的问题
https://forums.developer.apple.com/thread/12184
https://forums.developer.apple.com/thread/4999
我运行了XCode6和XCode7版本,didChangeObject这里的打印方法就是比较
XCode6 iOS 8.4
Update New: Optional(<NSIndexPath: 0xc000000000000016> {length = 2, path = 0 - 0}) Old: Optional(<NSIndexPath: 0xc000000000000016> {length = 2, path = 0 - 0})
Run Code Online (Sandbox Code Playgroud)
XCode 7b6 iOS 8.4
Update New: nil Old: Optional(<NSIndexPath: 0xc000000000000016> {length = 2, path = 0 - 0})
Insert New: Optional(<NSIndexPath: 0xc000000000000016> {length = 2, path = 0 - 0}) Old: Optional(<NSIndexPath: 0xc000000000000016> {length = 2, path = 0 - 0})
2015-09-01 01:15:37.898 TestProg[3230:200562] *** Assertion failure in -[UITableView _endCellAnimationsWithContext:], /SourceCache/UIKit/UIKit-3347.44.2/UITableView.m:1623
2015-09-01 01:15:37.900 TestProg[3230:200562] CoreData: error: Serious application error. An exception was caught from the delegate of NSFetchedResultsController during a call to -controllerDidChangeContent:. Invalid update: invalid number of rows in section 0. The number of rows contained in an existing section after the update (3) must be equal to the number of rows contained in that section before the update (3), plus or minus the number of rows inserted or deleted from that section (1 inserted, 0 deleted) and plus or minus the number of rows moved into or out of that section (0 moved in, 0 moved out). with userInfo (null)
Run Code Online (Sandbox Code Playgroud)
Mea*_*her 10
我尝试了几件事,我相信这是一个错误.正如您在我的日志中看到的那样,即使我更新现有记录,委托也会获得插入消息.在.Insert固定的问题上添加条件检查.我没有在表格中使用任何移动操作.因此,如果您使用.MoveMy Current代码,则可能需要相同类型的条件操作,如下所示
func controller(controller: NSFetchedResultsController, didChangeObject anObject: AnyObject, atIndexPath indexPath: NSIndexPath?, forChangeType type: NSFetchedResultsChangeType, newIndexPath: NSIndexPath?) {
switch type {
case .Insert:
//FIXME: iOS 9 Bug!
if indexPath != newIndexPath {
tableView.insertRowsAtIndexPaths([newIndexPath!], withRowAnimation: .Fade)
}
case .Delete:
tableView.deleteRowsAtIndexPaths([indexPath!], withRowAnimation: .Fade)
case .Update:
tableView.reloadRowsAtIndexPaths([indexPath!], withRowAnimation: .Fade)
// self.configureCell(tableView.cellForRowAtIndexPath(indexPath!)!, atIndexPath: indexPath!)
case .Move:
tableView.deleteRowsAtIndexPaths([indexPath!], withRowAnimation: .Fade)
tableView.insertRowsAtIndexPaths([newIndexPath!], withRowAnimation: .Fade)
}
}
Run Code Online (Sandbox Code Playgroud)
我试图更新单个记录,多个记录,到目前为止我还没有看到任何崩溃.我在用
tableView.reloadRowsAtIndexPaths([indexPath!], withRowAnimation: .Fade)
Run Code Online (Sandbox Code Playgroud)
方法但是
self.configureCell(tableView.cellForRowAtIndexPath(indexPath!)!, atIndexPath: indexPath!)
Run Code Online (Sandbox Code Playgroud)
在我的测试中也有效.
| 归档时间: |
|
| 查看次数: |
2663 次 |
| 最近记录: |