Search code examples
swiftuitableviewreloaddata

reloadData for UITableView doesn't work in a function with completion


I'm trying to call reloadData() function in a calling function using completion handler:

override func viewDidLoad()
{
    super.viewDidLoad()

    let appDel: AppDelegate = UIApplication.shared.delegate as! AppDelegate
    let context: NSManagedObjectContext = appDel.managedObjectContext

    tableView.rowHeight = UITableViewAutomaticDimension

    do{
        var request = NSFetchRequest<NSFetchRequestResult>(entityName: "Actualites")
        let count  = try context.count(for: request)
        if (count == 0) {
            REST().getArticles(limit: 5, limitstart: 0, catid: 6, key: "47347fd312afb0625020028298560d1f", context: context) {  (json) in

                CoreDataHelper().saveArticles(new: true, saveArticles: json, context: context)

                DispatchQueue.main.async {
                    self.tableView.reloadData()
                }
            }
        }

        actualites = try context.fetch(request) as! [Actualites]
    }catch{
        print(error)
    }
    DispatchQueue.main.async {
        self.tableView.reloadData()
    }
}

When I go into the if count... the uiTableView is not reloaded.


Solution

  • actualites = try context.fetch(request) as! [Actualites]

    actualities needs to be updated when you get the response data too. The UITableView does not know that this value is filled from a Core data fetch request.

    do {
            var request = NSFetchRequest<NSFetchRequestResult>(entityName: "Actualites")
            let count  = try context.count(for: request)
            if (count == 0) {
                REST().getArticles(limit: 5, limitstart: 0, catid: 6, key: "47347fd312afb0625020028298560d1f", context: context) {  (json) in
    
                    CoreDataHelper().saveArticles(new: true, saveArticles: json, context: context)
    
                    DispatchQueue.main.async {
                        actualites = try context.fetch(request) as! [Actualites]
                        self.tableView.reloadData()
                    }
                }
            }
        } catch {
            print(error)
        }