更新用户界面Swift

时间:2018-11-13 09:25:38

标签: ios arrays swift user-interface

大家好,任何人都可以帮助我,我很难从我的数组中更新ui,这是我的代码

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

我只成功更新了 prayerLabel.text 的用户界面,但是当我想获取祈祷时间时,我就被困在那里,因为当每个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 :(得分:1)

我认为您处于后台线程中,无法在后台线程上更新UI。请在下面尝试此操作,它可能会解决您的问题。

DispatchQueue.main.async {

                self.updateUI()
                self.tableView.reloadData()
                        }