iOS:tableView.reloadData() 在 swift3 中不起作用

Posted

技术标签:

【中文标题】iOS:tableView.reloadData() 在 swift3 中不起作用【英文标题】:iOS: tableView.reloadData() doesn't work in swift3 【发布时间】:2017-02-05 13:56:38 【问题描述】:

我是 Swift 新手,我正在尝试在 Swift 中更新数据后重新加载我的表格视图,但它似乎不起作用。当我更改选项卡并返回时,tableView 会重新加载,但不会自动加载。这是我的代码:

我的 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
    

【问题讨论】:

DispatchQueue.main.async... 在收到 Web 服务响应之前被调用。将其移动到 Alamofire 块内(在关闭 Alamofire 之前。 【参考方案1】:

设置datasource 数组后,您需要重新加载tableView。此外,您目前正在 Alamofire 块外重新加载 tableView,但它应该在 Alamofire 请求块内。所以像这样改变你的重新加载代码。

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()
            
        

    

【讨论】:

以上是关于iOS:tableView.reloadData() 在 swift3 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

iOS:tableView.reloadData() 在 swift3 中不起作用

tableView reloadData页面跳动问题

使用 tableView.reloadData() 重新加载 TableView 的问题

Swift:tableView.reloadData() 太慢了

使用通知中心和 tableview.reloaddata() 不刷新表视图

tableView.reloadData() 如何正确重新加载数据?