异步提取后的UITableView浮动单元格

时间:2018-02-16 20:15:18

标签: ios swift uitableview reloaddata reloadrows

这与上一个问题I here

的情况相同

基本上,UITableView单元格偶尔会与它们下面的数据重叠 - 我跟踪到了使用estimatedHeight进行reloadRows行动时,我的解决方法是在调用willDisplay cell:时缓存高度,然后返回该高度,或任意如果在调用heightForRow

时尚未看到该行,则为常量

但现在问题又回来了!好吧,类似的一个:在传播UITableView一些数据之后,其中一些是异步获取的,我希望能够搜索并重新填充UITableView。

我正在提取的这些数据可能已经或可能没有出现在TableView上,无论如何我都不会考虑 - 我点击了后端,抓住了一些东西,然后显示它。

除此之外,它变得很糟糕:

enter image description here

从截图中可以看出,有一个单元格覆盖在另一个具有相同内容的单元格之上。 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()
}

0 个答案:

没有答案