быстро загрузить tableView - PullRequest
0 голосов
/ 11 ноября 2018

Привет, у меня есть проблема с пользовательским интерфейсом в моем приложении, я делаю закрытие UITableView, чтобы он отображал половину моего экрана и устанавливал делегат tableView и dataSource в viewDidLoad. но мой пользовательский интерфейс загружается очень медленно, я пытаюсь использовать DispatchQueue в моем запросе, но ничего не работает. и попробуйте DispatchQueue.global (qos: .background) .async в делегате и источнике данных tableView; отображается пользовательский интерфейс и отображается табличное представление, но есть предупреждение, скажем, делегат tableView и основной запуск dataSource в основном потоке. Но загрузка объекта тоже медленная. Кто-нибудь может подсказать, что мне делать?

это мой код

let tableView: UITableView = {
    let view = UITableView()
    view.backgroundColor = .white
    view.layer.cornerRadius = 20
    return view
}()

это моя функция и вызывается в viewDidLoad

fileprivate func setupTableView() {
    DispatchQueue.main.async {
        self.tableView.delegate = self
        self.tableView.dataSource = self
        self.tableView.register(PrayerTimeViewCell.self, forCellReuseIdentifier: self.cellId)
        self.tableView.separatorColor = .clear
        self.tableView.backgroundColor = .clear
        self.tableView.rowHeight = 53
    }
}

это мой код запроса

DispatchQueue.global(qos: .background).async {
            Alamofire.request(prayerUrl, method: .get, parameters: nil, encoding: URLEncoding.default, headers: nil).responseData(completionHandler: { (dataResponse) in
                if let err = dataResponse.error {
                    print("Failed to fetch data:", err)
                    return
                }

                guard let data = dataResponse.data else { return }

                do {
                    let prayerData = try JSONDecoder().decode(PrayerModel.self, from: data)

                    prayerData.items.forEach({ (item) in
                        let shubuh = Prayer(prayerName: "Shubuh", prayerIcon: #imageLiteral(resourceName: "PartlyCloudyNight"), prayerTime: item.fajr)
                        let dzuhur = Prayer(prayerName: "Dzuhur", prayerIcon: #imageLiteral(resourceName: "Sunny"), prayerTime: item.dhuhr)
                        let ashar = Prayer(prayerName: "Ashar", prayerIcon: #imageLiteral(resourceName: "PartlyCloudyDay"), prayerTime: item.asr)
                        let maghrib = Prayer(prayerName: "Maghrib", prayerIcon: #imageLiteral(resourceName: "Overcast"), prayerTime: item.maghrib)
                        let isya = Prayer(prayerName: "Isya", prayerIcon: #imageLiteral(resourceName: "Clear"), prayerTime: item.isha)
                        self.prayers.append(contentsOf: [shubuh, dzuhur, ashar, maghrib, isya])
                    })
                    DispatchQueue.main.async {
                        self.tableView.reloadData()
                    }
                } catch let decodeErr {
                    print("Failed to decode:", decodeErr)
                }
            })
        }

my tableView

1 Ответ

0 голосов
/ 11 ноября 2018

Требуется некоторое время, чем вы получаете данные из http-запроса, поэтому ваше табличное представление останется без данных, пока http-запрос не будет завершен. В этом случае я предлагаю написать код без какого-либо DispatchQueue.main.async и т. Д.

Просто напишите это в функцию viewDidLoad:

override func viewDidLoad() {
    super.viewDidLoad()
    tableView.delegate = self
    tableView.dataSource = self
    tableView.register(PrayerTimeViewCell.self, forCellReuseIdentifier: cellId)
    tableView.separatorColor = .clear
    tableView.backgroundColor = .clear
    tableView.rowHeight = 53

    getPrayersData() // this is moment when you probably haven't got data yet
}

Теперь создайте функцию для getPrayerData ()

func getPrayersData() {
    Alamofire.request(prayerUrl, method: .get).responseJSON { response in

        // this is moment when request is completed

        guard let data = response.data else {
            print("Failed to fetch data:", response.error)
            return 
        }

        do {
            let prayerData = try JSONDecoder().decode(PrayerModel.self, from: data)

            prayerData.items.forEach({ (item) in
                let shubuh = Prayer(prayerName: "Shubuh", prayerIcon: #imageLiteral(resourceName: "PartlyCloudyNight"), prayerTime: item.fajr)
                let dzuhur = Prayer(prayerName: "Dzuhur", prayerIcon: #imageLiteral(resourceName: "Sunny"), prayerTime: item.dhuhr)
                let ashar = Prayer(prayerName: "Ashar", prayerIcon: #imageLiteral(resourceName: "PartlyCloudyDay"), prayerTime: item.asr)
                let maghrib = Prayer(prayerName: "Maghrib", prayerIcon: #imageLiteral(resourceName: "Overcast"), prayerTime: item.maghrib)
                let isya = Prayer(prayerName: "Isya", prayerIcon: #imageLiteral(resourceName: "Clear"), prayerTime: item.isha)
                self.prayers.append(contentsOf: [shubuh, dzuhur, ashar, maghrib, isya])
            })

            self.tableView.reloadData()

        } catch {
            print("Failed to decode: \(error)")
        }
    }
}
...