美文网首页IOS
Swift3.0封装 AFNetworking网络请求类之坑

Swift3.0封装 AFNetworking网络请求类之坑

作者: Miu七七 | 来源:发表于2016-12-08 13:36 被阅读1838次

    果然实践才是检验真理的硬道理,网上各种查不如自己写一遍
    以下是请求和上传文件的方法,以后再更其他的

    
    import UIKit
    import AFNetworking
    
    /// Swift 的枚举支持任意数据类型
    /// switch / enum 在 OC 中都只是支持整数
    /**
     - 如果日常开发中,发现网络请求返回的状态码是 405,不支持的网络请求方法
     - 首先应该查找网路请求方法是否正确
     */
    enum HWHTTPMethod {
        case GET
        case POST
    }
    
    /// 网络管理工具
    class HWNetworkManager: AFHTTPSessionManager {
    
        /// 静态区/常量/闭包
        /// 在第一次访问时,执行闭包,并且将结果保存在 shared 常量中
        static let shared:HWNetworkManager = {
            // 实例化对象
            let instance = HWNetworkManager()
            
            // 设置响应反序列化支持的数据类型
            instance.responseSerializer.acceptableContentTypes?.insert("text/plain")
            
            // 返回对象
            return instance
            
        }()
        
        // 将成功和失败的回调写在一个逃逸闭包中(请求)
        /// 封装 AFN 的 GET / POST 请求
        ///
        /// - parameter method:     GET / POST
        /// - parameter URLString:  URLString
        /// - parameter parameters: 参数字典
        /// - parameter completion: 完成回调[json(字典/数组), 是否成功]
    
        func request(requestType :HWHTTPMethod, url : String, parameters : [String : Any], resultBlock : @escaping([String : Any]?, Error?) -> ()) {
            
            // 成功闭包
            let successBlock = { (task: URLSessionDataTask, responseObj: Any?) in
                resultBlock(responseObj as? [String : Any], nil)
            }
            
            // 失败的闭包
            let failureBlock = { (task: URLSessionDataTask?, error: Error) in
                resultBlock(nil, error)
            }
            
            // Get 请求
            if requestType == .GET {
                get(url, parameters: parameters, progress: nil, success: successBlock, failure: failureBlock)
            }
            
            // Post 请求
            if requestType == .POST {
                post(url, parameters: parameters, progress: nil, success: successBlock, failure: failureBlock)
            }
        }
        // MARK: - 封装 AFN 方法
        /// 上传文件必须是 POST 方法,GET 只能获取数据
        /// 封装 AFN 的上传文件方法
        ///
        /// - parameter URLString:  URLString
        /// - parameter parameters: 参数字典
        /// - parameter name:       接收上传数据的服务器字段(name - 要咨询公司的后台) `pic`
        /// - parameter data:       要上传的二进制数据
        /// - parameter completion: 完成回调
        func unload(urlString: String, parameters: AnyObject?, constructingBodyWithBlock:((_ formData:AFMultipartFormData) -> Void)?, uploadProgress: ((_ progress:Progress) -> Void)?, success: ((_ responseObject:AnyObject?) -> Void)?, failure: ((_ error: NSError) -> Void)?) -> Void {
            
            
            HWNetworkManager.shared.post(urlString, parameters: parameters, constructingBodyWith: { (formData) in
                
                
                }, progress: { (progress) in
                    uploadProgress!(progress)
                }, success: { (task, objc) in
                    if objc != nil {
                        
                        success!(objc as AnyObject?)
                        
                    }
                }, failure: { (task, error) in
                    failure!(error as NSError)
                    
            })
            
        }
    
        
        
        //
    
       /*
        // 将成功和失败的回调分别写在两个逃逸闭包中
        func request(requestType : HWHTTPMethod, url : String, parameters : [String : Any], succeed : @escaping([String : Any]?) -> (), failure : @escaping(Error?) -> ()) {
            
            // 成功闭包
            let successBlock = { (task: URLSessionDataTask, responseObj: Any?) in
                succeed(responseObj as? [String : Any])
            }
            
            // 失败的闭包
            let failureBlock = { (task: URLSessionDataTask?, error: Error) in
                failure(error)
            }
            
            // Get 请求
            if requestType == .Get {
                get(url, parameters: parameters, progress: nil, success: successBlock, failure: failureBlock)
            }
            
            // Post 请求
            if requestType == .Post {
                post(url, parameters: parameters, progress: nil, success: successBlock, failure: failureBlock)
            }
        }
    
        */
        
    }
    
    

    使用方法

    
    
    
    

    相关文章

      网友评论

        本文标题:Swift3.0封装 AFNetworking网络请求类之坑

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