Обновление пользовательского интерфейса Swift - PullRequest
0 голосов
/ 13 ноября 2018

Привет всем может кто-нибудь помочь мне трудно обновить интерфейс из моего массива это мой код

fileprivate func fetchPrayer() {
        guard let city = self.city else { return}
        let url = "http://muslimsalat.com/\(city).json?key=6b67ed8d12d1f63fa200427bc794eff1"

        DispatchQueue.global(qos: .background).async {
            Alamofire.request(url, method: .get).responseJSON(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])
                    })
                    self.updateUI()
                    self.tableView.reloadData()

                } catch let decodeErr {
                    print("Failed to decode:", decodeErr)
                }
            })
        }
    }

@objc func scheduleTime() {
    timer = Timer(fireAt: Calendar.current.nextDate(after: Date(), matching: DateComponents(hour: 0..<23 ~= Date().hour ? 23 : 0), matchingPolicy: .nextTime)!, interval: 0, target: self, selector: #selector(updateUI), userInfo: nil, repeats: false)

    RunLoop.main.add(timer, forMode: .common)
}

@objc func updateUI() {
    locationLabel.text = city ?? "Current Location"

    if 4..<9 ~= Date().hour {
        coverImageView.image = #imageLiteral(resourceName: "saffu")
    } else if 14..<16 ~= Date().hour {
        guard let ashar = prayers.first(where: {$0.prayerName == "Ashar"}) else { return }
        prayerLabel.text = ashar.prayerName
        coverImageView.image = #imageLiteral(resourceName: "rezky")
    } else if 17..<18 ~= Date().hour {
        coverImageView.image = #imageLiteral(resourceName: "izuddin")
    } else if 18..<19 ~= Date().hour {
        coverImageView.image = #imageLiteral(resourceName: "nouman")
    } else if 0..<3 ~= Date().hour {
        coverImageView.image = #imageLiteral(resourceName: "ancient")
    }

    scheduleTime()
}

Я только успешно обновляю пользовательский интерфейс только молитвенник.текст , но когда я хочу получить время молитвы, я застрял там, поскольку, когда все данные json будут обновляться ежедневно, как я могу обновить пользовательский интерфейс. и я не знаю, чтобы получить конкретный объект, содержащий данные, которые я храню, как это.

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)

Спасибо за внимание

My UI

1 Ответ

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

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

DispatchQueue.main.async {

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