Почему моя функция не перезагружает данные UITableView? - PullRequest
0 голосов
/ 20 июня 2020

Я создаю табличное представление, которое отслеживает первые 20 твитов из нескольких учетных записей и отображает их в хронологическом порядке. Он обращается к API Twitter, а затем просматривает твиты и добавляет их в табличное представление. Моя проблема в том, что когда я пытаюсь обновить sh данные в табличном представлении, ничего не происходит. Я пытаюсь снова вызвать getTwitterInfo (), но он ничего не делает, даже если есть новые твиты, которые нужно показать. Я перепробовал все, что мог найти в Интернете, но, похоже, ничего не помогает. Любая помощь будет принята с благодарностью - вот код моего контроллера представления.

class TwitterViewController: UIViewController {

    var tableView = UITableView()

    var tweets = [Tweet]()

    let cellID = "cellID"

    var accounts: [String:String] = [
        //this is just a dictionary of the accounts I'm monitoring and their corresponding profile picture
    ]

    override func viewDidLoad() {
        super.viewDidLoad()
        navigationController?.setNavigationBarHidden(true, animated: false)

        configureTableView()
        getTwitterInfo()
    }

    func configureTableView(){
        view.addSubview(tableView)
        tableView.delegate = self
        tableView.dataSource = self

        tableView.rowHeight = UITableView.automaticDimension
        tableView.estimatedRowHeight = 150

        tableView.register(TweetCell.self, forCellReuseIdentifier: cellID)

        tableView.translatesAutoresizingMaskIntoConstraints = false
        tableView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
        tableView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
        tableView.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
        tableView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true


    }

    func getTwitterInfo(){

        print("getting new info...")


        tweets = [Tweet]()

        var counter = 1

        for (name, pfpLink) in accounts{
            let imageURL = URL(string:pfpLink)!

            var image = UIImage()

            let imageDataTask = URLSession.shared.dataTask(with: imageURL) { (data,response,error) in
                image = UIImage(data:data!)!
            }

            imageDataTask.resume()


            let url = URL(string: "https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name=\(name)&count=20&tweet_mode=extended")!

            var request = URLRequest(url: url)
            request.allHTTPHeaderFields = ["Authorization": Constants.bearer]

            let dataTask = URLSession.shared.dataTask(with: request){ (data,response,error) in
                do{
                    let data = try JSONSerialization.jsonObject(with: data!, options: []) as? [[String:Any]]

                    let _ = data!.map{
                        let htmlEncodedString = $0["full_text"] as! String

                        let message: String
                        if let newDict = $0["retweeted_status"] as? Dictionary<String,Any>{
                            let newEncodedString = newDict["full_text"] as! String
                            message = Constants.decodeTwitterString(newEncodedString)
                        }else{
                            message = Constants.decodeTwitterString(htmlEncodedString)
                        }

                        let userInfo = $0["user"] as! Dictionary<String,Any>

                        let screenName = userInfo["screen_name"] as! String
                        let username = userInfo["name"] as! String

                        let twitterID = userInfo["id_str"] as! String

                        let dateString = $0["created_at"] as! String

                        let tweet = Tweet(name: username, username: screenName, message: message, twitterID: twitterID, image:image, dateString: dateString)
                        self.tweets.append(tweet)
                    }

                    if (counter == self.accounts.keys.count) {
                            let formatter = DateFormatter()
                            formatter.dateFormat = "EE LLL dd HH:mm:ss Z yyyy"

                            self.tweets = self.tweets.sorted{
                                formatter.date(from: $0.dateString)! > formatter.date(from: $1.dateString)!
                            }
                        DispatchQueue.main.async{
                            self.tableView.reloadData()
                        }

                    }

                    counter += 1

                }catch let err{
                    print(err)
                }
            }

            dataTask.resume()

        }
    }
}

extension TwitterViewController: UITableViewDelegate, UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return tweets.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: cellID, for: indexPath) as! TweetCell
        let tweet = tweets[indexPath.row]

        cell.set(tweet:tweet)
        cell.selectionStyle = .none

        return cell
    }


}

1 Ответ

1 голос
/ 20 июня 2020

Я предполагаю, что вы проверили отсутствие исключений при попытке и сбоев при принудительном развертывании. Я думаю, вам следует переместить

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

наружу и после блока if, в котором он находится. Я подозреваю, что tableView.reloadData () не вызывается из-за сбоя проверки условий в блоке if, в котором он находится. Попробуйте и дайте мне знать, поможет ли он вам. Если это не так, вы можете отправить мне ссылку на свой проект, желательно с GitHub.

Если вам не нужна обратная совместимость с устройствами, работающими на iOS 13 ниже, Google UITableViewDiffableDataSource . Намного проще сделать это по-новому, это избавит вас от множества головных болей, особенно когда проект становится немного более сложным из-за того, что нужно управлять множеством изменений состояния tableview. Вот хорошая отправная точка, если вы хотите это проверить: [https://developer.apple.com/videos/play/wwdc2019/220/] [1]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...