swiftrssnsxmlparser

How to update RSS data in UITableView?


What I have: the project, written on SWIFT5, which is an rss reader (I use standard XMLParser ). I fill cells with data from parser. In order to update the data in cells I implemented UIRefreshControl and wrote objc method, which contains the same method(fetchData - see in code), as I use to get data, but it doesn't work. Moreover, this method is called only once, when app is launched. When I close app and then open, data is not updated... How can I deal with it?

What I want: when refreshControl is activated, data in cells should be updated

What I did: I declared a variable called refreshControl, add it to tableView and wrote a method #refresh related to control

import UIKit

class MainViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    @IBOutlet weak var table: UITableView!
    private let url = "my url"
    private var rssItems: [RSSItem]? {
        didSet {
            DispatchQueue.main.async {
                self.table.reloadData()
            }
        }
    }


    var refreshControl = UIRefreshControl()

    @objc func refresh (sender: UIRefreshControl) {
        fetchData()
        sender.endRefreshing()
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        refreshControl.addTarget(self, action: #selector(refresh(sender:)), for: .valueChanged)
        self.table.refreshControl = refreshControl
        table.addSubview(refreshControl)

       fetchData()


    }

    private func fetchData() {
        let feedParser = FeedParser()
        feedParser.parseFeed(url: url) { (rssItems) in
            self.rssItems = rssItems
            DispatchQueue.main.async {
                self.table.reloadData()
            }
        }

    }

Solution

  • End refreshing once you get data and set or add refresh control

    @objc func refresh (sender: UIRefreshControl) {
        fetchData()
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        refreshControl.addTarget(self, action: #selector(refresh(sender:)), for: .valueChanged)
        self.table.refreshControl = refreshControl
       // table.addSubview(refreshControl)
    
       fetchData()
    }
    
    private func fetchData() {
        let feedParser = FeedParser()
        feedParser.parseFeed(url: url) { (rssItems) in
            self.rssItems = rssItems // as you are reloading table here
            DispatchQueue.main.async {
                refreshControl.endRefreshing()
              //  self.table.reloadData()
            }
        }
    }