10.新浪微博Swift项目第十天

第十天

第十天我们的2个任务, 1. 联系FMDB,但事实上微博是不建议使用数据库存储的, 2. 处理表情键盘和其他细节 下边开始:

FMDB

  1. 使用cocoapods 导入 FMDB

  2. 准备创建表的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")
    );
    
  3. 创建数据库管理的单例 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")
    }
    
  4. 添加修改数据库数据的方法

    /// 新增或者修改微博数据
    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
                }
            }
        }
    }
    
  5. 添加从数据库查找数据的方法

    /// 从数据库加载微博数据
    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
    }
    
  6. 新建一个类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)
        }
    }
    

表情键盘的细节处理

  1. 创建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)
        }
    }
    

总结

今天我们就把微博项目全部完成了,作为swift的学习项目,实现的还是很不完美,还需要继续努力,项目代码在下边git地址, 想要看的朋友可以下载看一下

往期内容: Swift新浪微博项目更新目录

项目git地址

转载于:https://my.oschina.net/ozawa4865/blog/1579426

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值