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的更多相关文章
-
[每天记录一个Bug]Cell中由于block加载网络请求产生的复用
Bug 出现场景: cell中使用加载图片的网络请求出现复用,截图如下: 复用原因: Cell Model中只有一个用户的uid,所有用户相关信息:例如头像\名称\信息等是通过 ...
-
Swift语法基础入门四(构造函数, 懒加载)
Swift语法基础入门四(构造函数, 懒加载) 存储属性 具备存储功能, 和OC中普通属性一样 // Swfit要求我们在创建对象时必须给所有的属性初始化 // 如果没办法保证在构造方法中初始化属性, ...
-
分页插件思想:pc加载更多功能和移动端下拉刷新加载数据
感觉一个人玩lol也没意思了,玩会手机,看到这个下拉刷新功能就写了这个demo! 这个demo写的比较随意,咱不能当做插件使用,基本思想是没问题的,要用就自己封装吧! 直接上代码分析下吧! 布局: & ...
-
Android UI--自定义ListView(实现下拉刷新+加载更多)
Android UI--自定义ListView(实现下拉刷新+加载更多) 关于实现ListView下拉刷新和加载更多的实现,我想网上一搜就一堆.不过我就没发现比较实用的,要不就是实现起来太复杂,要不就 ...
-
移动端tab滑动和上下拉刷新加载
移动端tab滑动和上下拉刷新加载 查看demo(请在移动端模式下查看) 查看代码 开发该插件的初衷是,在做一个项目时发现现在实现移动端tab滑动的插件大多基于swiper,swiper的功能太强大而我 ...
-
ListView 刷新加载控件
1.MaterialRefreshLayout刷新加载: 导入依赖: compile 'com.cjj.materialrefeshlayout:library:1.3.0' 布局 <com.c ...
-
jQuery Pjax – 页面无刷新加载,优化用户体验
pjax 是 HTML5 pushState 以及 Ajax 两项技术的简称,综合这两个技术可以实现在不刷新页面的情况下载入 HTML 到当前网页,带给你超快速的浏览器体验,而且有固定链接.标题以及后 ...
-
android 在自定义的listview(有刷新加载项)列表中,数据过少时不能铺满整个屏幕时,header和footer同时显示问题
android 在自定义的listview(有刷新加载项)列表中,数据过少时,当刷新时,加载项也会显示,这是很头疼的一个问题,查阅了一些资料,总结了一个比较不错的方法: 原来代码: @Overrid ...
-
js中对arry数组的各种操作小结 瀑布流AJAX无刷新加载数据列表--当页面滚动到Id时再继续加载数据 web前端url传递值 js加密解密 HTML中让表单input等文本框为只读不可编辑的方法 js监听用户的键盘敲击事件,兼容各大主流浏览器 HTML特殊字符
js中对arry数组的各种操作小结 最近工作比较轻松,于是就花时间从头到尾的对js进行了详细的学习和复习,在看书的过程中,发现自己平时在做项目的过程中有很多地方想得不过全面,写的不够合理,所以说啊 ...
随机推荐
-
Python数据分析笔记目录
速查笔记 使用实例 Pandas-数据导入 (未完成) Pandas-数据探索 基础属性 shape indexs columns values dtype/dtypes 汇总和计算描述统计 coun ...
-
C+继承
// 继承.cpp : Defines the entry point for the console application.// #include "stdafx.h" str ...
-
【python】浅谈encode和decode
对于encode和decode,笔者也是根据自己的理解,有不对的地方还请多多指点. 编码的理解: 1.编码:utf-8,utf-16,gbk,gb2312,gb18030等,编码为了便于理解,可以把它 ...
-
jQuery ui datepicker 日历转中文
做个笔记,以后详解 jQuery(function($){ $.datepicker.regional['zh-CN'] = { closeText: '关闭', prevText: '<上月' ...
-
Android 内存溢出管理与测试
今天发现正在做的项目,时不时的会报错:dalvikvm heap out of memory on a 7458832-byte allocation (堆分配的内存溢出) 为什么会内存溢出呢?我以前 ...
-
在Android手机上获取其它应用的包名及版本
转载请注明出处:http://blog.csdn.net/jason_src/article/details/37757661 获取Android手机上其它应用的包名及版本方法有非常多,能够通过AAP ...
-
java解析xml文件并输出
使用java解析xml文件,通过dom4j,代码运行前需先导入dom4j架包. ParseXml类代码如下: import java.io.File; import java.util.ArrayLi ...
-
蓝桥杯比赛javaB组练习《四平方和》
四平方和 四平方和定理,又称为拉格朗日定理:每个正整数都可以表示为至多4个正整数的平方和.如果把0包括进去,就正好可以表示为4个数的平方和. 比如:5 = 0^2 + 0^2 + 1^2 + 2^27 ...
-
ERROR 1045 (28000): Access denied for user &#39;ODBC&#39;@&#39;localhost&#39; (using password: NO) ERROR 1045 (28000): Access denied for user &#39;ODBC&#39;@&#39;localhost&#39; (using password: YES)
windows下,以上两个错误的解决方法 工具/原料 windows 8 MySql 方法/步骤 找到配置文件my.ini ,然后将其打开,可以选择用记事本打开 打开后,搜索mysq ...
-
数列分块入门九题(三):LOJ6283~6285
Preface 最后一题我一直觉得用莫队是最好的. 数列分块入门 7--区间乘法,区间加法,单点询问 还是很简单的吧,比起数列分块入门 7就多了个区间乘. 类似于线段树,由于乘法的优先级高于加法,因此 ...