全栈项目iCCUT之客户端篇(三)

Posted by Maru on November 29, 2015

Talk is cheap show me the code.

(一)前言


终于来到了iOS的博文,相比较于之前Python和Java的搞笑,在这里我终于可以有一点话语权了,虽然不是学了一年半的OC,但是Swift毫无疑问将要是超越OC的存在,所以这个项目几乎是纯Swift的,除了一些框架。

上一周博主实现了接口的编写,这一周我们要做的事情就是把他们展示出来。成果如下:

Achievement.gif

由于博主的实际开发这个项目的时候的进程并不是线性的,所以有很多UI上的Code我就忽略掉了(其实也没啥好讲的)。

(二)思路和框架


思路:其实我们要做的东西也都很简单,无非就是获取到json数据,然后把它转化成一个模型,然后TableView再获取模型数据,最后再把他们展现出来。

那么问题就来了,用什么来获取JSON数据呢?由于觉得AFNetworking太厉害了,所以我选择了同门的Alamofire。至于解析JSON嘛,万能的Github让我找到了SwiftyJSON。至于刷新的框架,本来想用DGElasticPullToRefresh,但是它太过浮夸,而且并没有上拉的实现刷新,所以我还是使用了老牌的MJRefresh。

(三)SHOW YOU THE CODE


1.上拉下拉刷新

在刷新的block中,统一调用了一个loadData的方法,并且通过一个Bool的参数来决定是否需要清空数据源重新刷新。这样做的原因是刷新的逻辑大同小异,Don’t  repeat yourself,所以就暂时这个蠢办法。

tableView.mj_header = MJRefreshNormalHeader(refreshingBlock: { () -> Void in
    self.loadData(true)
});

tableView.mj_footer = MJRefreshBackNormalFooter(refreshingBlock: { () -> Void in
    self.loadData(false)
});
 

2.网络请求

是时候Alamofire出场了,其实它给了我一种不一样的Coding感觉,唯一让我不爽的是,它的提示并不十分友好,难道是我的问题?

        Alamofire.request(.POST, "\(HOST)/iCCUT/servlet/MediaList", parameters:parmeter, encoding: .URL)
            .responseJSON { response in
                
                switch response.result {
                case .Success:
                    
                    if isSetup {
                        self.dataArray.removeAllObjects()
                    }
                    
                    
                    if let value = response.result.value {
                        
                        let json = JSON(value)
                        
                        guard json["success"].boolValue else {
                            SCLAlertView().showInfo("温馨提示", subTitle: json["msg"].stringValue)

                            self.tableView.mj_footer.endRefreshing()
                            self.tableView.mj_header.endRefreshing()
                            return
                        }
                        
                        debugPrint(json.rawString())
                        for (_,subJson): (String,JSON) in json["datas"] {
                            let videoItem: CCVideoModel = CCVideoModel()
                            videoItem.name = subJson["title"].stringValue
                            videoItem.url = subJson["url"].stringValue
                            self.dataArray.addObject(videoItem)
                        }
                        
                        
                    }
                    
                    self.currentIndex++
                    
                    self.tableView.reloadData()
                    
                    break
                case .Failure:
                    SCLAlertView.showNetworkErrorView()
                    break
                }
                self.tableView.mj_footer.endRefreshing()
                self.tableView.mj_header.endRefreshing()
        }

其实上面的注释已经很详细了,Alamofire处理请求结果的方法和AFNetworking有很大的差别。统一获取一个闭包中的response,然后通过switch语句获取。至于JSON数据的解析,其实我本来是不想手打的,毕竟有一个比较厉害的人写了一个CFRuntime(现在改名成Reflect了),相当于Swity版本的MJExtension。由于我的数据太简单了,所以我也就懒得用这个框架了,通过SwiftyJSON我们可以非常愉快的和Alamofire一起工作,直接将response的value传给SwiftyJSON就可以完美解析数据。

顺便提一嘴,在上面的代码中,我用到了的HUD是SCLAlertView,开始的时候我用的是MBProgressHUD,但是由于原则是尽量使用Swift框架,所以我就抛弃了它,找了很多找到了它,非常华丽,也非常的简便,点个赞,哈哈~

(四)番外

其实这个礼拜还实现了一个功能,就是通过关键字搜索视频,其实实现起来也是非常的简单无非就是一行SQL代码:

String sql = "select * from FreeVideo where title like '%"+ keyword +"%' limit 0,20";

然后查询到的数据再通过JSONArray这个框架来返回给客户端视频列表然后再播放,成功如下:

SearchAchievement.gif

(五)结语


iCCUT这个全栈项目的主要目的还是为了熟悉iOS开发的整个思路,由于是第一次,所以也有很多的遗憾和缺陷,比如服务器代码机器丑陋,比如为什么不用更加轻量级的Flask,比如用户的交互能不能做的再好一点,自己的设计丑的一匹。不过欣慰的是,这个东西并不单单是个练习,我相信它是有生产力的,比如昨天晚上我就用它看了校园网上的《权利的游戏》,我是它的第一个用户,但愿不是最后一个。