试图在 viewWillAppear 中重新加载数据()

Posted

技术标签:

【中文标题】试图在 viewWillAppear 中重新加载数据()【英文标题】:Trying to reloadData() in viewWillAppear 【发布时间】:2019-04-17 20:31:41 【问题描述】:

我有一个 tabBarController,在其中一个选项卡中我可以选择要在我的收藏夹选项卡中的任何文档。

所以当我转到“收藏夹”选项卡时,应该会出现最喜欢的文档。

我在从 CoreData 获取喜欢的文档后调用重新加载:

override func viewWillAppear(_ animated: Bool) 

    languageSelected = UserDefaults().string(forKey: "language")!

    self.title = "favourites".localized(lang: languageSelected)

    // Sets the search Bar in the navigationBar.
    let search = UISearchController(searchResultsController: nil)
    search.searchResultsUpdater = self
    search.obscuresBackgroundDuringPresentation = false
    search.searchBar.placeholder = "searchDocuments".localized(lang: languageSelected)
    navigationItem.searchController = search
    navigationItem.hidesSearchBarWhenScrolling = false

    // Request the documents and reload the tableView.
    fetchDocuments()

    self.tableView.reloadData()


fetchDocuments()函数如下:

func fetchDocuments() 
    print("fetchDocuments")
    // We make the request to the context to get the documents we want.

    do 

        documentArray = try context.fetchMOs(requestedEntity, sortBy: requestedSortBy, predicate: requestedPredicate)
        ***print(documentArray) // To test it works ok.***
        // Arrange the documentArray per year using the variable documentArrayPerSection.
        let formatter = DateFormatter()
        formatter.dateFormat = "yyyy"

        for yearSection in IndexSections.sharedInstance.allSections[0].sections 

            let documentsFilteredPerYear = documentArray.filter  document -> Bool in
                return yearSection == formatter.string(from: document.date!)
            

            documentArrayPerSection.append(documentsFilteredPerYear)

        

     catch 

        print("Error fetching data from context \(error)")

    


从语句 print(documentArray) 我看到该函数更新了内容。但是 tableView 中没有重新加载文档。

如果我关闭应用程序并再次打开它,它就会更新。

不知道我做错了什么!!!

【问题讨论】:

我能想到的唯一问题是fetchMOs 在后台线程上执行,因此tableView.reloadData() 发生在documentArray 更新之前。是这样吗? 事实并非如此。这是函数:func fetchMOs (_ entityName: String, sortBy: [NSSortDescriptor]? = nil, predicate: NSPredicate? = nil) throws -> [Document] let request = NSFetchRequest(entityName: entityName) 请求。 returnObjectsAsFaults = false request.predicate = 谓词 request.sortDescriptors = sortBy return try! self.fetch(request) as! [文档] documentArrayPerSection 是否曾经被清除?切换标签的时候不是一直在追加吗? 只是出于好奇,如果将tableView.reloadData() 移动到viewDidAppear 会发生什么? @TomPearson 你是对的!!!!!!!!!这是清理 documentArrayPerSection 的问题!!!!!!!!! 【参考方案1】:

问题是你总是附加到documentArrayPerSection,但从不清除它,所以我想数组总是越来越大,但只有 tableView 的数据源请求的数组的开头被使用。我自己去过那里几次。

【讨论】:

@jRuMoL 乐于提供帮助:)【参考方案2】:

我假设在所有数据处理完成之前调用reloadData()。要解决此问题,您必须在获取完成后调用完成处理程序,然后才更新 tableView。

func fetchDocuments(_ completion: @escaping () -> Void) 
   do 
      // Execute all the usual fetching logic
      ...

      completion()
   
   catch  ... 

然后这样称呼它:

fetchDocuments() 
   self.tableView.reloadData()


祝你好运 :)

【讨论】:

以上是关于试图在 viewWillAppear 中重新加载数据()的主要内容,如果未能解决你的问题,请参考以下文章

如何重新加载 UIView?

UITableView reloadData在iOS 11中重新出现时崩溃

防止uitableView重新加载

在 tableView 中重新加载数据的问题

在 UIView 中重新加载 JSON 提要

阻止在 viewWillAppear 中打开窗口