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