Попытка перезагрузить dataдаНные () в viewWillAppear

#ios #swift #uitableview #tableview

#iOS #swift #uitableview #просмотр таблицы

Вопрос:

У меня есть 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 нет перезагрузки документов.

Если я закрою приложение и снова открою его, оно обновится.

Не знаю, что я делаю не так!!!

Комментарии:

1. Единственное, что я могу считать проблемой, это то, что fetchMOs выполняется в фоновом потоке, поэтому tableView.reloadData() это происходит до documentArray обновления. Так ли это?

2. Это не так. Это функция: func fetchMOs (_ EntityName: String, sortBy: [NSSortDescriptor]? = nil, предикат: NSPredicate? = ноль) выдает -> [Document] { пусть запрос = NSFetchRequest<NSFetchRequestResult>(EntityName: EntityName) запрос.Возвращает objectsasfaults = ложный запрос.предикат = запрос предиката.Сортировка описаний = сортировка по возврату попробуйте! self. выборка (запрос) как! [Документ]}

3. когда- documentArrayPerSection нибудь очищается? Разве вы не всегда добавляете к нему при переключении вкладок?

4. Просто из любопытства, что произойдет, если вы перейдете tableView.reloadData() в viewDidAppear ?

5. @TomPearson ты был прав!!!!!!!! Это была проблема очистки documentArrayPerSection!!!!!!!!

Ответ №1:

Проблема в том, что вы всегда добавляете documentArrayPerSection , но никогда не очищаете его, поэтому я полагаю, что массив всегда увеличивался, но использовалось только начало массива, который запрашивал источник данных TableView. Сам был там несколько раз.

Комментарии:

1. @jRuMoL рад помочь 🙂

Ответ №2:

Я предполагаю, что reloadData() это вызывается до завершения всей обработки данных. Чтобы исправить это, вам нужно будет вызвать обработчик завершения при выполнении выборки и только после этого обновить TableView.

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

      completion()
   }
   catch { ... }
}
 

И назовите это так:

 fetchDocuments() {
   self.tableView.reloadData()
}
 

Удачи 🙂