我无法搞清楚这个GCD问题。
假设表视图中有一个UITableViewCell。此单元格包含用户正在编辑的一些文本字段。用户完成编辑后,单元格将根据用户输入的内容在Core Data中创建一个新对象。此对象随insertNewObjectForEntityForName
一起插入。
在此之后,我需要在NSFetchedResultsController上performFetch
并重新加载tableview。但是,我还想在tableview的末尾添加一个新单元格,以便用户可以将另一个项目添加到其列表中。
我正在尝试这样做:
dispatch_async(dispatch_get_main_queue(), {
do {
try self.fetchedResultsController.performFetch()
} catch {
fatalError("Fetch failed: \(error)")
}
self.tableView.insertRowsAtIndexPaths([NSIndexPath(forRow: self.fetchedResultsController.sections!.first!.numberOfObjects - 1, inSection: 0)], withRowAnimation: .Automatic)
self.tableView.reloadData()
})
添加了新单元格,但没有行动画。我认为我对GCD和核心数据有误解。谢谢你的帮助。
答案 0 :(得分:0)
需要使用第一个闭包作为异步运行的线程进程。一旦完成该过程,它将进入第二个闭包,它在主线程上用你的视图做任何事情
dispatch_async(dispatch_get_global_queue(priority, 0)) {
// process here
do {
try self.fetchedResultsController.performFetch()
} catch {
fatalError("Fetch failed: \(error)")
}
dispatch_async(dispatch_get_main_queue(), { Void in
// then refresh UI
self.tableView.insertRowsAtIndexPaths([NSIndexPath(forRow: self.fetchedResultsController.sections!.first!.numberOfObjects - 1, inSection: 0)], withRowAnimation: .Automatic)
self.tableView.reloadData()
})
}
查看本教程以获取详细信息https://www.raywenderlich.com/79149/grand-central-dispatch-tutorial-swift-part-1
答案 1 :(得分:0)
通过实施:
解决了这个问题func controller(controller: NSFetchedResultsController, didChangeObject anObject: AnyObject, atIndexPath indexPath: NSIndexPath?, forChangeType type: NSFetchedResultsChangeType, newIndexPath: NSIndexPath?)
在此函数中使用switch
语句可以更好地控制发生的每个更改:
switch type {
case NSFetchedResultsChangeType.Insert:
print("Insert")
case NSFetchedResultsChangeType.Delete:
print("Delete")
case NSFetchedResultsChangeType.Update:
print("Update")
case NSFetchedResultsChangeType.Move:
print("Move")
}
在此开关中,您可以使用indexPath
删除单元格,添加单元格,无论您想要什么。只需使用insertRowsAtIndexPaths
或其他相关功能。