swiftfirebaseuitableviewfirebase-realtime-database

Updating Values after Closure


I have been trying fetch data from firebase and storing it in a dataModel using completion handler like this


static var dataModels = [DataModel]()

static func fetchData(completion: @escaping () -> Void) {
    let ref = Database.database().reference().child("data")
    ref.observe(
        .value,
        with: { snapshot in
            guard let value = snapshot.value as? [[String: Any]] else {
                return
            }

            for data in value {
                guard let contentArray = data["content"] as? [[String: String]] else {
                    return
                }

                var content = [Content]()

                for item in contentArray {
                    guard let imageURL = item["imageURL"],
                        let title = item["title"],
                        let description = item["description"]
                    else {
                        continue
                    }

                    content.append(
                        Content(imageURL: imageURL, title: title, description: description))
                }

                guard let videoURL = data["videoURL"] as? String,
                    let videoTitle = data["videoTitle"] as? String,
                    let videoDescription = data["videoDescription"] as? String
                else {
                    continue
                }

                let dataModel = DataModel(
                    videoURL: videoURL, videoTitle: videoTitle, videoDescription: videoDescription,
                    content: content)

                DataFetch.dataModels.append(dataModel)
            }

            // Reload your table view after the data has been fetched and appended

            completion()
        })
}

and accessing it like

DataFetch.fetchData {
    self.title.text = DataFetch.dataModels[0].videoTitle
}

but i want to set the number of rows for

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    return 0

}

I tried by using

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    var numberOfRows: Int?
    DataFetch.fetchData {
        number = DataFetch.dataModels[0].content[0].count
    }
    return numberOfRows!
    // Return Found Nil error
}

When I tried to debug it's coming inside of fetchData but it's showing nil in return.

Any Solution for this


Solution

  • Refactor your code to

    var numberOfRows: Int? 
    override func viewDidLoad() {  
       super.viewDidLoad()
       DataFetch.fetchData { [weak self] in
           self?.numberOfRows = DataFetch.dataModels.first?.content.first?.count
           self?.tableView.reloadData() 
       }
    }
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
         return numberOfRows ?? 0
    }