swift4初探之网络请求

来源:互联网 发布:热化学数据库建库情况 编辑:程序博客网 时间:2024/05/18 02:38

都说程序员必须要写博客,可是作为一个老程序员的我基本上是看别人的博客,自己很少写,其中最主要的原因是自己懒,不愿意总结,还一个原因就是现在的网络实在太发达了,写代码也基本不用看什么书,背什么代码,理解几个设计模式,会个选择,顺序,循环就都可以写说自己是程序员了,剩下的哪不会百度就好,下面会出来一堆和你遇到类似问题的人,和类似的问题解决方法,所以我也就更懒得去写了。那么从现在开始就要慢慢改过来了,一方面是觉得自己岁数大了,写了这么久代码是应该总结总结了,另一个原因是swift4现在国内的资源确实不多,所以自己为了以后的发展打算,有必要总结一下,写一下swift4的基本用法,这篇文章主要就是swift4的网络请求,还包括闭包的声明,使用,delegate的声明使用,但是还是有oc的影子,看到@objc了吗?没办法,找不到其他的方法不用@objc,只能一步一步根据提示又把它加上来了,还好最后的用法看起来确实像swift。废话不多说,下面的两片代码,第一个是网络请求封装,包括,post,get请求方式,闭包,代理回调方式,都有。第二个就是调用。自己总结的同时也希望能够抛砖引玉,让更多的人入门,也欢迎大家评论,给出更好的建议和连接。


//

//  HTTPConnection.swift

//  Swift4HttpConnectionDemo

//

//  Created by 高明阳(01370716) on 2017/9/26.

//  Copyright © 2017年 高明阳(01370716). All rights reserved.

//


import UIKit


typealias RequestCallBack = (Data?,Error?) ->Void


@objc protocol HTTPConnectionDelegate:NSObjectProtocol {

  @objc  func finishConnection(data:Data);

  @objc  func failedConnection(error:Error);

}


class HTTPConnection: NSObject {

    var block:RequestCallBack?;

    var delegate:HTTPConnectionDelegate?

    

    ///类方法

     ///  get,delegate

    class func getRequestWithDelegate(urlStr:String,param:Dictionary<String,AnyObject>?,delegate:HTTPConnectionDelegate){

        HTTPConnection().getRequestConnectionWithDelegate(urlStr: urlStr, param: param, delegate: delegate);

    }

    

    ///  post,delegate

    class func postRequestWithDelegate(urlStr:String,param:Dictionary<String,AnyObject>?,delegate:HTTPConnectionDelegate){

        HTTPConnection().postRequestConnectionWithDelegate(urlStr: urlStr, param: param, delegate: delegate);

    }

    

    /// get,block

    class func getRequestWithBlock(urlStr:String,param:Dictionary<String,AnyObject>?,block:@escapingRequestCallBack){

        HTTPConnection().getRequestConnectionWithBlock(urlStr: urlStr, param: param, block: block);

    }

    

    /// post,delegate

    class func postRequestWithBlock(urlStr:String,param:Dictionary<String,AnyObject>?,block:@escapingRequestCallBack){

        HTTPConnection().postRequestConnectionWithBlock(urlStr: urlStr, param: param, block: block);

    }

    

    

    ///对象方法

    ///  get,delegate

    func getRequestConnectionWithDelegate(urlStr:String,param:Dictionary<String,AnyObject>?,delegate:HTTPConnectionDelegate) -> Void {

        self.delegate = delegate;

        var myUrlStr:String?;

        if param != nil {

            let list = NSMutableArray();

            for (key ,value) in param! {

                let tmp:String ="\(key)=\(value)";

                list.add(tmp);

            }

            let paramStr = list.componentsJoined(by:"&");

            myUrlStr = urlStr.appendingFormat("?%@", paramStr);

        }else {

            myUrlStr = urlStr;

        }

        print("url:\(myUrlStr!)")

        let url = URL(string: myUrlStr!);

        let request = URLRequest(url: url!);

        

        let config =URLSessionConfiguration.default;

        let session = URLSession(configuration: config);

        

        let task    = session.dataTask(with: request) { (data, response, error)in

            if error == nil {

               let canDo =self.delegate?.responds(to:#selector(HTTPConnectionDelegate.finishConnection(data:)));

                if canDo! {

                    self.delegate!.finishConnection(data: data!);

                }

            }else {

                

               let canDo = self.delegate?.responds(to:#selector(HTTPConnectionDelegate.failedConnection(error:)));

                if canDo! {

                    self.delegate!.failedConnection(error: error!);

                }

            }

        }

        task.resume();

    }

    

     ///  post,delegate

    func postRequestConnectionWithDelegate(urlStr:String,param:Dictionary<String,AnyObject>?,delegate:HTTPConnectionDelegate) -> Void{

        self.delegate = delegate;

        

        print("url:\(urlStr)")

        let url = URL(string: urlStr);

        var request = URLRequest(url: url!);

        request.httpMethod ="POST";

        

        if param != nil {

            let list = NSMutableArray();

            for (key ,value) in param! {

                let tmp:String ="\(key)=\(value)";

                list.add(tmp);

            }

            let paramStr = list.componentsJoined(by:"&");

            let paramData = paramStr.data(using: .utf8);

            request.httpBody = paramData;

        }

        

        let config =URLSessionConfiguration.default;

        let session = URLSession(configuration: config);

        

        let task    = session.dataTask(with: request) { (data, response, error)in

            if error == nil {

                let canDo =self.delegate?.responds(to:#selector(HTTPConnectionDelegate.finishConnection(data:)));

                if canDo! {

                    self.delegate!.finishConnection(data: data!);

                }

            }else {

                

                let canDo = self.delegate?.responds(to:#selector(HTTPConnectionDelegate.failedConnection(error:)));

                if canDo! {

                    self.delegate!.failedConnection(error: error!);

                }

            }

        }

        task.resume();

    }

    

    /// get ,block 回调

    //@noescape。简单的介绍就是如果这个闭包是在这个函数结束前内被调用,就是非逃逸的即noescape。

    //@escaping  这个闭包是在函数执行完后才被调用,调用的地方超过了这函数的范围,所以叫逃逸闭包。

    func getRequestConnectionWithBlock(urlStr:String,param:Dictionary<String,AnyObject>?,block:@escapingRequestCallBack) -> Void {

        self.block = block;

        var myUrlStr:String!

        

        if param != nil {

            let list = NSMutableArray();

            for (key ,value) in param! {

                let tmp:String ="\(key)=\(value)";

                list.add(tmp);

            }

            let paramStr = list.componentsJoined(by:"&");

            myUrlStr = urlStr.appendingFormat("?%@", paramStr);

        }else {

            myUrlStr = urlStr;

        }

        print("url:\(myUrlStr!)")

        let url = URL(string: myUrlStr!);

        let request = URLRequest(url: url!);

        

        let config =URLSessionConfiguration.default;

        let session = URLSession(configuration: config);

        

        let task    = session.dataTask(with: request) { (data, response, error)in

            self.block?(data,error);

        }

        task.resume();

    }

    

    /// post,block

    func postRequestConnectionWithBlock(urlStr:String,param:Dictionary<String,AnyObject>?,block:@escapingRequestCallBack) -> Void {

        self.block = block;

        

        print("url:\(urlStr)")

        let url = URL(string: urlStr);

        var request = URLRequest(url: url!);

        request.httpMethod ="POST";

        

        if param != nil {

            let list = NSMutableArray();

            for (key ,value) in param! {

                let tmp:String ="\(key)=\(value)";

                list.add(tmp);

            }

            let paramStr = list.componentsJoined(by:"&");

            let paramData = paramStr.data(using: .utf8);

            request.httpBody = paramData;

        }

        

        let config =URLSessionConfiguration.default;

        let session = URLSession(configuration: config);

        

        let task    = session.dataTask(with: request) { (data, response, error)in

            self.block?(data,error);

        }

        task.resume();

    }

}




====================================================

//

//  ViewController.swift

//  Swift4HttpConnectionDemo

//

//  Created by 高明阳(01370716) on 2017/9/26.

//  Copyright © 2017年 高明阳(01370716). All rights reserved.

//


import UIKit


class ViewController: UIViewController ,HTTPConnectionDelegate{


    override func viewDidLoad() {

        super.viewDidLoad()

        //  https://facebook.github.io/react-native/movies.json

//        HTTPConnection.getRequestWithDelegate(urlStr: "https://facebook.github.io/react-native/movies.json", param: nil, delegate: self);

//         HTTPConnection.postRequestWithDelegate(urlStr: "https://facebook.github.io/react-native/movies.json", param: nil, delegate: self);

//        HTTPConnection.getRequestWithBlock(urlStr: "https://facebook.github.io/react-native/movies.json", param: nil) { (data, error) in

//            if error != nil {

//                print("error:\(error!)")

//            }else {

//                let str = String(data: data!, encoding: .utf8);

//                print("data:\(str!)");

//            }

        //        };

        

        

        HTTPConnection.postRequestWithBlock(urlStr:"https://facebook.github.io/react-native/movies.json", param:nil) { (data, error) in

                        if error !=nil {

                            print("error:\(error!)")

                        }else {

                            let str =String(data: data!, encoding: .utf8);

                            print("data:\(str!)");

                        }

        };

    }



    //MARK:HTTPConnectionDelegate

    func finishConnection(data:Data) {

        print("finishConnection");

        let str:String! =String(data: data, encoding: .utf8);

        print("data:\(str!)");

    }

    

    func failedConnection(error:Error) {

        print("failedConnection:\(error)")

    }

    

}