1. 程式人生 > >Swift基礎之Demo包含重新整理,載入,網路請求,MVC

Swift基礎之Demo包含重新整理,載入,網路請求,MVC

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;
    }

效果圖: