使用到的第三方库
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格式缓存到本地之中,在用户下一次打开这个界面的时候,就会优先加载本地数据,从而完成等待时间减少的优化。
最终效果
顺便一提
最近一直在刷力扣和重写这个App的部分界面,最近我也会更新一下我的算法笔记和重写思路。这个App也在上架审核的过程中,也算是付出了很大的心血吧