Swift中有一个Alamofire第三方是进行网络请求的,它是AFNetworking的作者写的Swift形式,今天先介绍一下,利用pod导入AFNetworking,SVProgressHUD,MJRefresh等第三方实现刷新数据、加载更多、网络请求,同时使用了MVC的模式进行界面搭建,随后研究Alamofire实现网络请求的功能,再分享给大家。。。。

本文有两个界面,首界面直接使用的AFNetworking进行网络请求,然后界面展示

首界面创建表格:

self.myTableView = UITableView.init(frame: CGRect.init(x: 0, y: 0, width: SCREEN_W, height: SCREEN_H), style: UITableViewStyle.plain);
        self.myTableView.delegate = self;
        self.myTableView.dataSource = self;
        self.myTableView.rowHeight = 80;
        self.myTableView.tableHeaderView = UIView.init();
        self.myTableView.tableFooterView = UIView.init();
        self.view.addSubview(self.myTableView);
        //注册Cell
        self.myTableView.register(MyCellTableViewCell.self, forCellReuseIdentifier: "myCell");
        // Nib 注册
        //self.tableView.registerNib(UINib(nibName: "MyCellTableViewCell", bundle: nil), forCellReuseIdentifier: "myCell")
        //添加下拉刷新
        self.myTableView.mj_header = MJRefreshNormalHeader(refreshingBlock: {
            //数据加载
            self.pageIndexI = 1;
            self.dataHttpRequest(pageIndexStr: NSString.init(format: "%d", self.pageIndexI));
        });
        //设置启动即刷新
        //self.myTableView.mj_header.beginRefreshing();

然后进行网络请求方法:

//MARK:-------AFNetworking基本的数据请求形式(未封装的方法)
    func dataHttpRequest(pageIndexStr:NSString) {
        
        SVProgressHUD.show(withStatus: "正在加载");
        if pageIndexStr.isEqual(to: "1") {
            self.dataArray.removeAllObjects();
        }
        
        let urlStr = "http://www.healthmanage.cn/android/hrsBabyAction_loadHrsBabyHealth.action";
        let paramsDic = ["userId":"38567","pagesize":"8","pageIndex":pageIndexStr];
        
        //AFNetworking使用POST请求
        let sessionManager = AFHTTPSessionManager.init();
        sessionManager.responseSerializer.acceptableContentTypes?.insert("text/plain");
        sessionManager.post(urlStr, parameters: paramsDic, progress: nil, success: { (_, responseObject) -> Void in
            //print("输出此时的数据请求结果......\(responseObject)");
            
            SVProgressHUD.dismiss(withDelay: 1);
            self.myTableView.mj_header.endRefreshing();
            //守卫语句,用于判断不符合条件时安全退出,而不是crash
            guard (responseObject as? NSDictionary) != nil else{
                print("返回数据为nil,或者 类型不匹配");
                return;
            };
            let resultDic = responseObject as! NSDictionary;
            let successB = resultDic["success"] as! Bool;
            if(successB){
                //如果返回有值
                let itemArray = resultDic["ITEMS"] as! NSArray;
                
                if(self.myTableView.mj_footer != nil)
                {
                    self.myTableView.mj_footer.endRefreshing();
                }
                else
                {
                    //判断数组数量和page,如果符合条件就添加上拉加载
                    if(itemArray.count == 8 && pageIndexStr.isEqual(to: "1"))
                    {
                        self.myTableView.mj_footer = MJRefreshBackNormalFooter(refreshingBlock:{ () -> Void in
                            
                            self.pageIndexI = self.pageIndexI+1;
                            self.dataHttpRequest(pageIndexStr: NSString.init(format: "%d", self.pageIndexI));
                        })
                    }
                }
                
                for dic in itemArray {
                    //因为数组中是:[String:AnyObject]字典类型,所以不能使用as!NSDictionary,我是这么理解的,不知道对不对
                    let itemDic = dic as! [String:AnyObject];
                    self.dataArray.add(itemDic);
                }
                self.myTableView.reloadData();
            }
            else
            {
                //请求无数据NOVALUE情况
                if self.dataArray.count>0{
                    self.myTableView.mj_footer.endRefreshing();
                    self.myTableView.mj_footer = nil;
                }
            }
            }) { (_, error) in
                print("请求数据错误报告...........\(error)");
                SVProgressHUD.showError(withStatus: "网络请求错误");
        }

首界面完成后进行第二层界面的设计,采用MVC的结构进行样式创建:

创建表格界面,然后使用数据请求工具和Model进行数据的解析,然后在Cell中进行Model数据的展示

数据请求工具方法:

//创建请求数据的工具方法
    //参数说明:mType:方式   URLString:url   parametersDic:参数   success:成功闭包结构   failure:失败闭包结构
    func urlRequestTool(mType:MethodTypes,URLString:String,parametersDic:Dictionary<String,Any>?,successComplete: @escaping SuccessClosure,failureComplete:@escaping FailureClosure) {
        SVProgressHUD.show(withStatus: "正在加载");
        if mType == .GET {
            self.get(URLString, parameters: parametersDic, progress: nil, success: { (_, respData) -> Void in
                //返回数据
                SVProgressHUD.dismiss(withDelay: 1);
                successComplete(respData);
            }, failure: { (_, err) in
                //返回错误
                SVProgressHUD.dismiss(withDelay: 1);
                failureComplete(err);
            })
        }else{
            self.post(URLString, parameters: parametersDic, progress: nil, success: { (_, respData) in
                //返回数据
                SVProgressHUD.dismiss(withDelay: 1);
                successComplete(respData);
            }, failure: { (_, err) in
                //返回错误
                SVProgressHUD.dismiss(withDelay: 1);
                failureComplete(err);
            })
        }
    }

Model类:

class MyDic: NSObject {
    var petNameStr:String!;
    var genderIdStr:String!;
    var birthdayStr:String!;
    
    init(dict:[String:AnyObject]) {
        super.init();
        self.petNameStr = dict["petName"] as! String!;
        self.genderIdStr = dict["genderId"] as! String!;
        self.birthdayStr = dict["birthday"] as! String!;
    }
}

Cell中数据展示:
    func setMyDicModel(dataModel:MyDic)
    {
        self.nameLabel.text = dataModel.petNameStr;
        let sexStr = dataModel.genderIdStr;//也可以转成NSString使用
        //NSString 有一个方法isEqualToString 方法用来判断两个字符串是否完全相等,String没有这个方法,但是因为String是值类型所以可以直接用 == 判断是否完全相等。
        if sexStr == "1" {
            self.sexImgView.image = UIImage.init(named: "baby_sex_boy");
            self.headImgView.image = UIImage.init(named: "baby_default_boy");
        }
        else
        {
            self.sexImgView.image = UIImage.init(named: "baby_sex_girl");
            self.headImgView.image = UIImage.init(named: "baby_default_girl");
        }
        
        self.birthDayLabel.text = NSString.init(format: "生日:%@",dataModel.birthdayStr) as String;
    }

效果图:

具体代码讲解看源码中的文字注释,如果不错请点赞,谢谢,转载请注明出处。。。。:https://github.com/hbblzjy/Swift-RefreshHTTP.git

Swift基础之Demo包含刷新,加载,网络请求,MVC的更多相关文章

  1. [每天记录一个Bug]Cell中由于block加载网络请求产生的复用

    Bug 出现场景:   cell中使用加载图片的网络请求出现复用,截图如下:         复用原因:   Cell Model中只有一个用户的uid,所有用户相关信息:例如头像\名称\信息等是通过 ...

  2. Swift语法基础入门四(构造函数, 懒加载)

    Swift语法基础入门四(构造函数, 懒加载) 存储属性 具备存储功能, 和OC中普通属性一样 // Swfit要求我们在创建对象时必须给所有的属性初始化 // 如果没办法保证在构造方法中初始化属性, ...

  3. 分页插件思想:pc加载更多功能和移动端下拉刷新加载数据

    感觉一个人玩lol也没意思了,玩会手机,看到这个下拉刷新功能就写了这个demo! 这个demo写的比较随意,咱不能当做插件使用,基本思想是没问题的,要用就自己封装吧! 直接上代码分析下吧! 布局: & ...

  4. Android UI--自定义ListView(实现下拉刷新+加载更多)

    Android UI--自定义ListView(实现下拉刷新+加载更多) 关于实现ListView下拉刷新和加载更多的实现,我想网上一搜就一堆.不过我就没发现比较实用的,要不就是实现起来太复杂,要不就 ...

  5. 移动端tab滑动和上下拉刷新加载

    移动端tab滑动和上下拉刷新加载 查看demo(请在移动端模式下查看) 查看代码 开发该插件的初衷是,在做一个项目时发现现在实现移动端tab滑动的插件大多基于swiper,swiper的功能太强大而我 ...

  6. ListView 刷新加载控件

    1.MaterialRefreshLayout刷新加载: 导入依赖: compile 'com.cjj.materialrefeshlayout:library:1.3.0' 布局 <com.c ...

  7. jQuery Pjax – 页面无刷新加载,优化用户体验

    pjax 是 HTML5 pushState 以及 Ajax 两项技术的简称,综合这两个技术可以实现在不刷新页面的情况下载入 HTML 到当前网页,带给你超快速的浏览器体验,而且有固定链接.标题以及后 ...

  8. android 在自定义的listview(有刷新加载项)列表中,数据过少时不能铺满整个屏幕时,header和footer同时显示问题

    android  在自定义的listview(有刷新加载项)列表中,数据过少时,当刷新时,加载项也会显示,这是很头疼的一个问题,查阅了一些资料,总结了一个比较不错的方法: 原来代码: @Overrid ...

  9. js中对arry数组的各种操作小结 瀑布流AJAX无刷新加载数据列表--当页面滚动到Id时再继续加载数据 web前端url传递值 js加密解密 HTML中让表单input等文本框为只读不可编辑的方法 js监听用户的键盘敲击事件,兼容各大主流浏览器 HTML特殊字符

    js中对arry数组的各种操作小结   最近工作比较轻松,于是就花时间从头到尾的对js进行了详细的学习和复习,在看书的过程中,发现自己平时在做项目的过程中有很多地方想得不过全面,写的不够合理,所以说啊 ...

随机推荐

  1. 是否有必要学习使用纯Verilog写一个SDRAM控制器

    在做这个SDRAM控制器之前,博主有一个疑问,对于学生来说,是否有必要学习用纯Verilog写一个SDRAM控制器?因为目前X家和A家都有了DDR IP Core,对于要实现一个应用可以直接调用IP ...

  2. [HAOI 2006]旅行comf

    Description 题库链接 给你一个 \(n\) 个点, \(m\) 条边的无向图.并给出一个点对 \((s,t)\) ,求 \(s,t\) 间的一条路径,使得路径上最大边和最小边的比值最小. ...

  3. 【NOIP 2017】列队

    Description Sylvia 是一个热爱学习的女♂孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有n×m名学生,方阵的行数为 n ...

  4. ●BOZJ 2229 [Zjoi2011]最小割

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2229 题解: 首先先去看看这个博客:http://blog.csdn.net/jyxjyx2 ...

  5. bzoj4830 hnoi2017 抛硬币

    题目描述 小 A 和小 B 是一对好朋友,他们经常一起愉快的玩耍.最近小 B 沉迷于**师手游,天天刷本,根本无心搞学习.但是已经入坑了几个月,却一次都没有抽到 SSR,让他非常怀疑人生.勤勉的小 A ...

  6. Codeforces 2B. The least round way

    There is a square matrix n × n, consisting of non-negative integer numbers. You should find such a w ...

  7. php留言板的实现

    留言板功能的实现,主要就是通过编程语言对数据库进行操作,简单说也就是插入和查询的实现.不管是什么语言进行实现,道理都是一样的. 应学习需要,这里用php世界上最美的语言来进行实现. 主要步骤为: 连接 ...

  8. 解决nodejs中json序列化时Date类型为UTC格式

    在nodejs中,json序列化时Date类型时,默认转为UTC格式. 如下图 zhupengfei@DESKTOP-HJASOE3 MINGW64 /d/MyProject/exp2 $ node ...

  9. 脱离文档流两操作,float和position:absolute的区别

    文档流:将窗体自上而下分成一行行, 并在每行中按从左至右的顺序排放元素,块状元素独占一行,内联元素不独占一行: CSS中脱离文档流,也就是将元素从普通的布局排版中拿走,其他盒子在定位的时候,会当做脱离 ...

  10. 函数的形参和实参之arguments对象

    当函数调用函数时候传入的实参比函数声明时候制定的形参要少时候,剩余的形参就设置成了undefined.例如 function getPropertyNames(o,/*optional*/a){ va ...