//首页加载的数据的迁移
class func loadHomeData(sinceId: Int64,maxId: Int64,finished: @escaping ([[String : Any]]?) -> ()) {
let res = checkoutStatus(sinceId: sinceId, maxId: maxId)
//if let result ',' 可以获取到赋值的结果
if let result = res, result.count > 0 {
//有缓存数据 返回缓存数据
//TODO: 待返回
finished(result)
return
}
//没有缓存数据, 请求网络数据
let urlString = "https://api.weibo.com/2/statuses/home_timeline.json"
let parameters = ["access_token" : HMUserAccountViewModel.shared.access_token,
"max_id" : "\(maxId)",
"since_id" : "\(sinceId)"]
HMNetworkTools.shared.request(method: .GET, urlString: urlString, parameters: parameters, finished: { (responseObject,error) -> () in
if error != nil {
//告诉外界请求失败 在闭包中如何完成失败的回调
//TODO: 完成失败的回调
finished(nil)
return
}
//成功
let dict = responseObject as! [String : Any]
//尝试转换为字典类型的数组
guard let array = dict["statuses"] as? [[String : Any]] else {
finished(nil)
return
}
//回调的网络 请求的结果
finished(array)
//存储到本地
cacheStauts(array: array)
})
}
//1.检查本地是否有缓存数据
class func checkoutStatus(sinceId: Int64,maxId: Int64) -> [[String : Any]]? {
//查询的sql
guard let userId = HMUserAccountViewModel.shared.userAccount?.uid else {
return nil
}
//会将数据库中所有的缓存数据都查找到
var sql = "SELECT status FROM T_Status WHERE userId = \(userId) "
//拼接sql
//如果sinceId > 0 标识需要查找新数据
if sinceId > 0 {
//向上查找
sql += "AND statusId > \(sinceId) "
}
if maxId > 0 {
//向下查找
sql += "AND statusId < \(maxId) "
}
//排序 降序
sql += "ORDER BY statusId DESC "
//限制条数
sql += "LIMIT 100"
print(sql)
//实例化数据
var array = [[String : Any]]()
HMSQLiteTools.shared.queue.inDatabase { (db) in
guard let res = db!.executeQuery(sql, withArgumentsIn: nil) else {
//在闭包中不能够return
return
}
//逐条获取数据
while res.next() {
//获取status 二进制数据
let jsonData = res.data(forColumn: "status")
//转换为json 字典
let dict = try! JSONSerialization.jsonObject(with:jsonData!, options: [])
array.append(dict as! [String : Any])
}
}
return array
}
//2. 如果本地有缓存数据 就直接返回本地的缓存数据,给用户节省流量,让用户在没有网络的情况可以浏览之前的内容
//3. 没有缓存数据就请求网络数据 返回网络数据
//4. 获取网络数据之后就应该立即存储网络数据
/*
statusId
status
userId
*/
class func cacheStauts(array: [[String : Any]]) {
//获取userId
guard let userId = HMUserAccountViewModel.shared.userAccount?.uid else {
print("用户没有登录呢")
return
}
//sql
//如果在对应的主键下已经存在数据 就执行替换的操作
let sql = "INSERT OR REPLACE INTO T_Status (statusId,status,userId) VALUES (?,?,?)"
HMSQLiteTools.shared.queue.inTransaction { (db, rollback) in
for item in array {
let statusId = item["id"]!
//数据库中能够存储的数据不能够是Foundation 需要将字典数据转换二进制数据存储到数据库中
//如果是字典数据 在读取的时候会有问题
let jsonData = try! JSONSerialization.data(withJSONObject: item, options: [])
let res = db!.executeUpdate(sql, withArgumentsIn: [statusId,jsonData,userId])
if !res {
//不成功就执行回滚
rollback?.pointee = true
return
}
}
}
}
网友评论