第十天
第十天我们的2个任务, 1. 联系FMDB,但事实上微博是不建议使用数据库存储的, 2. 处理表情键盘和其他细节 下边开始:
FMDB
-
使用
cocoapods
导入 FMDB -
准备创建表的SQL语句, 如下
-- 创建微博数据表 --CREATE TABLE IF NOT EXISTS "T_Status" ( "statusId" INTEGER NOT NULL, "userId" INTEGER NOT NULL, "status" TEXT, "createTime" TEXT DEFAULT (datetime('now', 'localtime')), PRIMARY KEY ("statusId", "userId"));
-
创建数据库管理的单例
XQSQLiteManager
3.1 在初始化的时候,执行SQL创建表
func createTable() { // 1.SQL guard let path = Bundle.main.path(forResource: "status.sql", ofType: nil), let sql = try?String(contentsOfFile: path) else { return } // 2.执行SQL queue.inDatabase { (db) in if db.executeStatements(sql) == true { print("成功") } } print("voer")}
-
添加修改数据库数据的方法
/// 新增或者修改微博数据func updateStatus(userId:String, array: [[String: AnyObject]]) { // 1. SQL let sql = "INSERT OR REPLACE INTO T_Status (statusId, userId, status) VALUES (?, ?, ?);" // 2. 执行SQL queue.inTransaction { (db, rollback) in for dict in array { // 讲字典序列化成为二进制 guard let statusId = dict["idstr"] as? String , let jsonData = try?JSONSerialization.data(withJSONObject: dict, options: []) else { continue } if db.executeUpdate(sql, withArgumentsIn: [statusId, userId, jsonData]) == false { // 回滚 rollback.pointee = true break } } }}
-
添加从数据库查找数据的方法
/// 从数据库加载微博数据func loadStatus(userId:String, since_id: Int64 = 0, max_id: Int64 = 0) -> [[String: AnyObject]] { // 1.准备sql var sql = "SELECT statusId, userId, status FROM T_Status \n" sql += "WHERE userId = \(userId) \n" if since_id > 0 { sql += "AND statusId > \(since_id) \n" }else if max_id > 0{ sql += "AND statusId < \(max_id) \n" } sql += "ORDER BY statusId DESC LIMIT 20;" // 检查sql // print(sql) // 2.执行sql let array = execRecordSet(sql: sql) // 3.遍历数组,反序列化 var result = [[String: AnyObject]]() for dict in array { guard let jsonData = dict["status"] as? Data, let json = try?JSONSerialization.jsonObject(with: jsonData, options: []) as? [String: AnyObject] else { continue } result.append(json ?? [:]) } return result}
-
新建一个类
XQWBStatusListDAL
处理离线数据, 这个类只有一个方法class func loadStatus(since_id: Int64 = 0, max_id: Int64 = 0, completion:@escaping (_ list:[[String:AnyObject]]?, _ isSuccess:Bool)->()) { // 0. 获取userId guard let userId = XQWBNetWorkManager.shared.userAccount.uid else { return } // 1. 检查本地数据,如果有 直接返回 let array = XQSQLiteManager.shared.loadStatus(userId: userId, since_id: since_id, max_id: max_id) // 判断数组数量 if array.count > 0 { completion(array, true) return } // 2. 如果没有,家在网络数据 XQWBNetWorkManager.shared.statusList(since_id: since_id, max_id: max_id) { (list, isSuccess) in if !isSuccess { completion(nil, false) return } guard let list = list else { completion(nil, isSuccess) return } // 3. 加载完成以后,讲网络数据写入数据库 XQSQLiteManager.shared.updateStatus(userId: userId, array: list) // 4. 返回网络数据 completion(list, isSuccess) }}
表情键盘的细节处理
- 创建
XQWBEmoticonTipView
处理点击表情的时候气泡弹出, 声明一个emoticon
属性, 在设置属性的时候处理显示图片和动画var emoticon: XQWBEmoticon? { didSet { if emoticon == preEmoticon { return } preEmoticon = emoticon tipBtn.setTitle(emoticon?.emoji, for: .normal) tipBtn.setImage(emoticon?.image, for: .normal) // pop 动画 let anim: POPSpringAnimation = POPSpringAnimation(propertyNamed: kPOPLayerPositionY) anim.fromValue = 30 anim.toValue = 8 anim.springBounciness = 20 anim.springSpeed = 20 tipBtn.layer.pop_add(anim, forKey: nil) }}