核心数据:执行获取后插入新行

时间:2016-06-28 17:10:14

标签: swift core-data grand-central-dispatch

我无法搞清楚这个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和核心数据有误解。谢谢你的帮助。

2 个答案:

答案 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或其他相关功能。