iOS 11 UITableView performBatchUpdates完成闭包未被调用

时间:2018-05-22 03:58:16

标签: ios swift uitableview ios11 performbatchupdates

我有一个UITableView,它显示了来自多个RSS Feed的帖子的汇总Feed。每当我的应用程序从Feed中提取新帖子时,我都会创建一个对象,表示更新UITableView当前行所需的所有插入和删除操作。我将这些对象放入一个用作FIFO队列的数组中。每隔几秒钟,我从该数组中拉出第一个元素,并尝试使用函数UITableViewUITableView:performBatchUpdates内执行所有插入和删除。

这一切都很有效...只要用户不上下滚动UITableView。如果滚动正在进行,更新将停止,因为我正在设置一个标志,以确保我始终等到最后一组插入/删除完成后才开始下一批,可悲的是,有时,完成关闭UITableView:performBatchUpdates永远不会被调用,因此我的旗帜永远不会被清除。

以下是我用于处理UITableView的传入更改队列的代码:

@objc func updateFeedPostsTableView() {

    guard feedUpdateQueue.count > 0,
          !feedTableUpdateInProgress else { return }

    feedTableUpdateInProgress = true
    let feedUpdate = feedUpdateQueue.first!
    feedUpdateQueue.remove(at: 0)

    self.aggregatedRSSFeed = feedUpdate.feed

    self.feedPostsTableView.performBatchUpdates ({
        self.feedPostsTableView.deleteRows(at: feedUpdate.indexPathsOfDeletedPosts,
                                           with: .fade)
        self.feedPostsTableView.insertRows(at: feedUpdate.indexPathsOfNewPosts,
                                           with: .top)
        },
        completion: { (success) in
            self.feedTableUpdateInProgress = false
        }
    )
}

我的问题是,为什么UITableView.performBatchUpdates无法调用其完成块?我在这里做错了什么?

这是iOS 11.2,使用Xcode版本9.2。

谢谢!

1 个答案:

答案 0 :(得分:0)

我遇到了这个问题。主UITableView块正在执行,但从未调用完成块。我发现问题是由我使用UITableView的子类引起的。当我切换回普通UITableView时,问题就消失了。

教训。不要继承{{1}}。