这与上一个问题I here
的情况相同基本上,UITableView单元格偶尔会与它们下面的数据重叠 - 我跟踪到了使用estimatedHeight进行reloadRows行动时,我的解决方法是在调用willDisplay cell:
时缓存高度,然后返回该高度,或任意如果在调用heightForRow
但现在问题又回来了!好吧,类似的一个:在传播UITableView
一些数据之后,其中一些是异步获取的,我希望能够搜索并重新填充UITableView。
我正在提取的这些数据可能已经或可能没有出现在TableView上,无论如何我都不会考虑 - 我点击了后端,抓住了一些东西,然后显示它。
除此之外,它变得很糟糕:
从截图中可以看出,有一个单元格覆盖在另一个具有相同内容的单元格之上。 TableView仅通过numberOfRows
报告有2行,但View Hierarchy表示当我点击TableView时有3个单元格存在。
我唯一能想到的是,在获取openGraph数据后重新加载时会发生一些奇怪的竞争条件或交互。
是什么给出的?
一些代码:
搜索
fileprivate func search(searchText: String, page: Int) {
postsService.searchPosts(searchText: searchText, page: page) { [weak self] posts, error in
if let weakSelf = self {
if let posts = posts, error == nil {
if !posts.isEmpty {
weakSelf.postListController.configureWith(posts: posts, deletionDelegate: nil, forParentView: "Trending")
weakSelf.page = weakSelf.page + 1
weakSelf.scrollTableViewUp()
} else {
// manually add a "No results found" string to tableFooterView
}
} else {
weakSelf.postListController.configureWith(posts: weakSelf.unfilteredPosts, deletionDelegate: nil, forParentView: "Trending")
weakSelf.scrollTableViewUp()
}
}
}
}
** configureWith *
func configureWith(posts: [Post], deletionDelegate: DeletionDelegate?, forParentView: String) {
self.posts = posts
for post in posts {
//some data pre-processing
if some_logic
if rawURLString.contains("twitter") {
let array = rawURLString.components(separatedBy: "/")
let client = TWTRAPIClient()
let tweetID = array[array.count - 1]
client.loadTweet(withID: tweetID, completion: { [weak self] (t, error) in
if let weakSelf = self {
if let tweet = t {
weakSelf.twitterCache.addTweetToCache(tweet: tweet, forID: Int(tweetID)!)
}
}
})
}
openGraphService.fetchOGData(url: rawURL, completion: { [weak self] (og, error) in
weakSelf.openGraphService.fetchOGImageData(url: ogImageURL, completion: { (data, response, error) in
if let imageData = data {
weakSelf.imageURLStringToData[ogImageString] = imageData
weakSelf.queueDispatcher.dispatchToMainQueue {
for cell in weakSelf.tableView.visibleCells {
if (cell as! PostCell).cellPost == post {
let cellIndexPath = IndexPath(row: weakSelf.posts.index(of: post)!, section: 0)
weakSelf.tableView.reloadRows(at: [cellIndexPath], with: UITableViewRowAnimation.automatic)
}
}
}
}
})
})
}
self.deletionDelegate = deletionDelegate
self.parentView = forParentView
queueDispatcher.dispatchToMainQueue { [weak self] in
if let weakSelf = self {
weakSelf.tableView.reloadData()
}
}
scrollToPost()
}