简体   繁体   中英

iOS: tableView.reloadData() doesn't work in swift3

I am new to Swift, I'm trying to reload my table view after updating data in Swift but it doesn't seems to work. When I change tab and go back the tableView is reloaded but not automatically. Here is my code:

My TableViewController :

 class AllChannelTableViewController: UITableViewController {

    var modelChannel = [AllCnannelModel]()

    let realm = try! Realm()

    lazy var channels: Results<ChannelData> = { self.realm.objects(ChannelData.self) }()

    override func viewDidLoad() {
        super.viewDidLoad()
        defaultChannel()
    }

    func defaultChannel() {

        if channels.count == 0 {

           SVProgressHUD.show(withStatus: "dowload")

            let URL = "http://52.50.138.211:8080/ChanelAPI/chanels"

            Alamofire.request(URL).responseArray { (response: DataResponse<[AllCnannelModel]>) in

                let channelArray = response.result.value

                if let channelArray = channelArray {
                    for channel in channelArray {
                        try! self.realm.write() {
                            let newChannel = ChannelData()
                            newChannel.category_id = channel.category_id!
                            newChannel.idChannel = channel.id!
                            print(newChannel.idChannel)
                            newChannel.name = channel.name!
                            print(newChannel.name)
                            newChannel.picture = channel.picture
                            newChannel.url = channel.url!
                            print(newChannel.url)
                            self.realm.add(newChannel, update: true)
                        }
                    }
                }
            }
            DispatchQueue.main.async{
                self.tableView.reloadData()
                self.channels = self.realm.objects(ChannelData.self)
            }
        }
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    // MARK: - Table view data source

    override func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
       // self.tableView.reloadData()
        return self.channels.count
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! AllChannelTableViewCell

        let strUrl = channels[indexPath.row].picture

        cell.nameChannel.text = self.channels[indexPath.row].name
        cell.urlChannel.text = self.channels[indexPath.row].url
        cell.imageChannel.downloadFrom(url: URL(string: strUrl)!)

        SVProgressHUD.dismiss()

        return cell
    }
}

You need to reload the tableView after setting the your datasource array. Also you are currently reloading the tableView outside the Alamofire block but it should be inside the Alamofire request block. So change your reload code like this way.

func defaultChannel() {

    if channels.count == 0 {

       SVProgressHUD.show(withStatus: "dowload")

        let URL = "http://52.50.138.211:8080/ChanelAPI/chanels"

        Alamofire.request(URL).responseArray { (response: DataResponse<[AllCnannelModel]>) in

            let channelArray = response.result.value

            if let channelArray = channelArray {
                for channel in channelArray {
                    try! self.realm.write() {
                        let newChannel = ChannelData()
                        newChannel.category_id = channel.category_id!
                        newChannel.idChannel = channel.id!
                        print(newChannel.idChannel)
                        newChannel.name = channel.name!
                        print(newChannel.name)
                        newChannel.picture = channel.picture
                        newChannel.url = channel.url!
                        print(newChannel.url)
                        self.realm.add(newChannel, update: true)
                    }
                }
            }
            DispatchQueue.main.async{
                //First set array
                self.channels = self.realm.objects(ChannelData.self)
                //Now reload the tableView
                self.tableView.reloadData()
            }
        }

    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM