成绩查询界面优化

首页 / iOS / 正文

使用到的第三方库

Alamofire,HandyJSON,SwiftyJSON,SwiftyUserDefaults

需求分析

由于我们学校只有期末考试没有期中考试,所以每学期的成绩都会在寒暑假期间公布,如果不将成绩数据缓存到内存当中,每次查询都会发起网络请求,这样会产生一定的等待时间,所以从用户的角度出发,我们需要缓存数据,减少等待时间,优化用户体验。

缓存过程

在我之前的一篇文章中已经说过,我们在UIViewController初始化之前,应该先判断本地有没有缓存数据,如果有就直接跳过网络请求,如果没有,就执行数据请求部分。

    func fetchLocalTermCacheDate() {
        ZCProgressHUD.showWithStatus("查询中")
        var cacheDate: Dictionary<String, Any>? = BusinessCache.shared.getTermCache()

        guard let cahchedate = cacheDate else {
            fetchInitTerm()
            return
        }
        guard let data = SchoolInfoDataModel.deserialize(from: cahchedate) else {
            fetchInitTerm()
            return
        }
        guard data.datas.count != 0 else {
            fetchInitTerm()
            return
        }
        termDatas = data.datas
        configNavBarDropMenuView()
    }

在这里我们先应该在视图上加载等待的小圆圈,然后利用三重判断是否本地存有数据,如果没有再执行我们网络请求数据的部分。

    func configScoreData(with value: String) {
        ZCProgressHUD.showWithStatus("查询中")

        let url = "http://xxxxxxx"
        guard let username = getStudentXH() else {
            ZCProgressHUD.showErrorWithStatus("获取失败,请重新拉取")
            return
        }
        guard let password = getStudentPassword() else {
            ZCProgressHUD.showErrorWithStatus("获取失败,请重新拉取")
            return
        }

        let param: [String: Any] = [
            "username": username,
            "password": password,
        ]

        NetworkTools.shared.requestWith(url: url, method: .POST, params: param) { backData in
            if let data = [GradesPythonModel].deserialize(from: backData as? Array) {
                var das = GradesPythonDataModel()

                data.forEach { item in
                    guard var it = item else { return }
                    guard let score = Int(it.score) else { return }
                    it.jd = String(Double(score - 50) / 10.0)
                    it.termName = self.trashTerm(with: it.term)
                    it.xf = "\(it.credit)"
                    das.datas.append(it)
                }
                self.scoreData = das.datas
                self.headerView.updateUI(with: das.datas)
                ZCProgressHUD.dismiss()
                self.tableView.reloadData()
                let local = JSON(das.toJSON())
                BusinessCache.shared.setGradesCache(data: local.dictionaryObject)
            }
        } error: { type, err in
            switch type {
            case .msg, .net:
                if let errStr = err as? String {
                    ZCProgressHUD.showErrorWithStatus(errStr + "\n账号或密码错误,请重试")
                } else {
                    ZCProgressHUD.showErrorWithStatus("请求出错啦!请重试")
                }

            default:
                break
            }
            ZCLog.debug(err)
        }
    }

在数据请求方法中,我们需要在完成UI绘制之后将请求下来的数据转化为JSON格式缓存到本地之中,在用户下一次打开这个界面的时候,就会优先加载本地数据,从而完成等待时间减少的优化。

最终效果

grades.gif

顺便一提

最近一直在刷力扣和重写这个App的部分界面,最近我也会更新一下我的算法笔记和重写思路。这个App也在上架审核的过程中,也算是付出了很大的心血吧

无标签
评论区
头像
文章目录