美文网首页
Swift-OC网络数据请求包装

Swift-OC网络数据请求包装

作者: YQ_苍穹 | 来源:发表于2018-05-31 10:41 被阅读0次

    首页获取数据

    class NewsListViewController: UIViewController,UITableViewDelegate,UITableViewDataSource {

        vartableDataArr:[Any]?  //用于给表格赋值于的数组

        vartable:UITableView?    //表格视图

        overridefuncviewDidLoad() {

            super.viewDidLoad()

            self.table=UITableView(frame:CGRect.init(origin:SCR_Origin, size:SCR_Size), style: .plain)

            self.table?.delegate=self

            self.table?.dataSource=self

            self.table?.rowHeight=65

            self.view.addSubview(self.table!)

        }

        overridefuncviewWillAppear(_animated:Bool) {

            leturlHandle =URLHandle()

            urlHandle.getNewsData(channel:"头条", start:0, vc:self) { (jsonData:Any, success:Bool)in

                ifsuccess ==false{

                    return

                }

                print(jsonData)

                // 给表格数组赋值,刷新表格

                self.tableDataArr= jsonDataas? [Any]

                // 回UI主线程刷新表格

                DispatchQueue.main.async {

                    self.table?.reloadData()

                }

            }

        }

        // MARK: - ------------------ UITableViewDataSource -----------

        functableView(_tableView:UITableView, numberOfRowsInSection section:Int) ->Int{

            ifletcount =self.tableDataArr?.count{

                returncount

            }

            return0

        }

        functableView(_tableView:UITableView, cellForRowAt indexPath:IndexPath) ->UITableViewCell{

            letcellIdentifier ="cell"

            varcell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier)

            ifcell ==nil{

                cell =UITableViewCell(style: .subtitle, reuseIdentifier: cellIdentifier)

            }

            //得到每个cell对应的字典

            letcellDic =self.tableDataArr![indexPath.row]as!NSDictionary

            cell?.textLabel?.text= cellDic["title"]as?String

            returncell!

        }

    }

    网络数据请求(GET)封装

    classURLHandle:NSObject{

        //菊花等待指示器

        private var indicatorView:UIActivityIndicatorView?

        //私有方法,判断有无网络连接

        privatefuncconnectNetWork(vc:UIViewController) ->Bool{

            if Reachability.forLocalWiFi().currentReachabilityStatus() == NotReachable && Reachability.forInternetConnection().currentReachabilityStatus() == NotReachable {

                self.showAlert(message:"网络连接失败,请检查网络", vc: vc)

                returnfalse

            }

            return true

        }

        //显示提示框

        privatefuncshowAlert(message:String,vc:UIViewController) ->Void{

            //实例化弹出视图控制器

            letalertCtl =UIAlertController(title:nil, message: message, preferredStyle: .alert)

            //弹出

            vc.present(alertCtl, animated:true, completion:nil)

            //2.5秒后自动消失

            self.perform(#selector(hideAlertVC(sender:)), with: alertCtl, afterDelay:2.5)

        }

        //隐藏提示框

        @objcfunchideAlertVC(sender:UIAlertController) ->Void{

            sender.dismiss(animated:true, completion:nil)

        }

        //显示菊花

        privatefuncshowIndicationView(v:UIViewController) {

            ifindicatorView==nil{

                indicatorView=UIActivityIndicatorView(activityIndicatorStyle: .gray)

                //设置位置

                indicatorView?.frame=CGRect(origin:CGPoint(x:SCR_Width/2-10, y:SCR_Height/2-10), size:CGSize(width:30, height:30))

                //设置停止自动隐藏效果

                indicatorView?.hidesWhenStopped=true

            }

            v.view.addSubview(indicatorView!)

            indicatorView?.startAnimating()

        }

        //隐藏菊花

        privatefunchideIndicatorView() ->Void{

            if indicatorView != nil && (indicatorView?.isAnimating)! {

                indicatorView?.startAnimating()

                indicatorView?.removeFromSuperview()

                indicatorView=nil

            }

        }

        // 私有方法,使用GET请求数据

        privatefuncGET(url:String,paramDic:[String:String]?,vc:UIViewController,pass:@escaping(Any,Bool)->Void) {

            //判断没有网络连接,直接跳出方法调用

            if!self.connectNetWork(vc: vc) {

                pass("error",false)  //调用闭包,返回数据

                return

            }

            //开始转动菊花

            self.showIndicationView(v: vc)

            //须要将所有的参数拼接到网址字符串上

            varurlStr = url

            ifletpDic = paramDic {

                //拼接?

                urlStr.append("?")

                //遍历参数再点,将键值对拼接到字符串上

                for(key,value)inpDic {

                    urlStr.append("\(key)=\(value)&")

                }

                //去掉最后一个无用的&

                urlStr.remove(at: urlStr.index(before: urlStr.endIndex))

                //如果带汉字,做转码处理

                urlStr = urlStr.addingPercentEncoding(withAllowedCharacters:CharacterSet.urlFragmentAllowed)!

            }

            //将字符串转换为url

            letMURL =URL.init(string: urlStr)

            //将URL封装为Request对象

            letreq =URLRequest(url: MURL!, cachePolicy: .reloadIgnoringLocalAndRemoteCacheData, timeoutInterval:10.0)

            //网络会话对象,请求网络数据

            URLSession.shared.dataTask(with: req) { (data:Data?, response:URLResponse?, error:Error?)in

                //回到UI主线程,停止菊花转动

                DispatchQueue.main.async {

                    self.hideIndicatorView()

                }

                //如果服务器错误给客户提示,结束执行

                iflet_= error {

                    //回到UI主线程给客户弹框提示

                    DispatchQueue.main.async{

                        self.showAlert(message:"服务器连接超时", vc: vc)

                    }

                    pass("error",false)  //调用闭包,返回数据

                    return

                }

                //JSON解析

                letjsonData =try?JSONSerialization.jsonObject(with: data!, options: .allowFragments)

                ifjsonData ==nil{

                    DispatchQueue.main.async{

                        self.showAlert(message:"网络数据错误", vc: vc)

                    }

                    pass("error",false)

                    return

                }

                pass(jsonData!,true)

            }.resume()

        }

        // 私有方法,使用POST请求数据

        privatefuncPOST(url:String,paramDic:[String:String],vc:UIViewController,pass:(Any,Bool)->Void) {

        }

        // 接口,用于获取新闻数据

        publicfuncgetNewsData(channel:String,start:Int,vc:UIViewController,completion:@escaping(Any,Bool)->Void) {

            //请求网址字符串

            let url = "http://api.jisuapi.com/news/get"

            // 将请求参数做成字典

            letparamDic = ["channel":channel,

                            "start":"\(start)",

                            "num":"20",

                            "appkey":"de394933e1a3e2db"]

            //使用get请求网络数据

            self.GET(url: url, paramDic: paramDic, vc: vc) { (jsonData, success)in

                if!success {

                    completion("error",false)

                    return

                }

               //获取status字段,判断值不为0,表示失败,给客户提示

                letstatus = (jsonDataas!NSDictionary).value(forKey:"status")as!NSString

                ifstatus.intValue!=0{

                    letmsg = (jsonDataas!NSDictionary).value(forKey:"msg")as!String

                    DispatchQueue.main.async{

                        self.showAlert(message: msg, vc: vc)

                    }

                    completion("error",false)

                    return

                }

                //获取result字典

                letresultDic = (jsonDataas!NSDictionary).value(forKey:"result")as!NSDictionary

                //获取result字典中的list数组

                letlistArr = resultDic.value(forKey:"list")as!NSArray

                //

                completion(listArr,true)

            }

        }

        //请求学生名单数据

        funcgetAllStudents(vc:UIViewController,completion:@escaping(Any,Bool)->Void) {

            //网址字符串

            let urlStr = "http:127.0.0.1/Students.json"

            self.GET(url: urlStr, paramDic:nil, vc: vc) { (data, success)in

                if!success {

                    completion("error",false)

                    return

                }

                completion(data,true)

            }

        }

    }

    相关文章

      网友评论

          本文标题:Swift-OC网络数据请求包装

          本文链接:https://www.haomeiwen.com/subject/ezzfsftx.html