Alamoffireの簡単な使用

5584 ワード

最近のプロジェクトはSwiftなので、AFNをネットワークのフレームワークとして使っていません.OCからSwiftを使ってもいいですが、個人的には新しいものを勉強しなければならないと思います.プロジェクトは無駄です.だから、AFNと同じチームで開発したAlamoffを使ってSwiftの開発を行います.
Alamoffで使用します
  • とAFMのように、著者達はこのクラスを直接使用して操作することを望んでいません.ネットワークツールクラスを構築し、それを継承し、単例を設定します.このように、一例を使って、つまりAFMフレームを使用します.このような方法は後期の変更に便利です.
  • AFANとAlamoffireの設定は単例でも簡単です.あなた自身のために呼び出すべきmanagerは一つの例です.ですから、簡単に一つの包装をするだけでいいです.ここでstaticのキーワードを使って、全体の量はメモリだけを作ります.
     //   
        static let shareInstance: NetworkTools = {
            let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
            configuration.HTTPAdditionalHeaders = Manager.defaultHTTPHeaders
            
            return NetworkTools(configuration: configuration)
        }()
    
  • は本当にAlamoffireに対して一つの方法を使うと言っています.
  • です.
    request(...){...}
    
    ここでは、使用について説明します.AFMとは、ネットワーク要求に対してGETとPOSTの2つの要求方式があります.しかし、Alamoffireの2つの方法については、関数を行うだけで実現できます.Swiftは関数の書き換えをサポートしています.関数応答式プログラミング思想は、
    ここで私が書いた関数を簡単に貼り付けます.皆さん、見てください.笑わないでください.
    //       ,              
        func loginXQT(username name: String,
                        password code: String,
                        finish:(dict: [String: AnyObject]?, error: NSError?) -> ()){
    
            SVProgressHUD.setMinimumDismissTimeInterval(1.0)
            SVProgressHUD.showWithStatus("    ")
            SVProgressHUD.setDefaultMaskType(.Black)
            // 1.     
            let path = "mUserLogin.htm"
            // 2.     
            let parameter = ["userLogingName": name , "userLogingCode": code]
            
            /**
            *           ,  Alamofire                  .              ,                 .  ....              ,
                request ,      
                responseJson ,         ,         
                
                      response   .  result.               ,      
            */
            request(.POST, baseURL + path, parameters: parameter).responseJSON { (response) -> Void in
                
                
                if response.result.isSuccess
                    {
                        SVProgressHUD.showSuccessWithStatus("    ")
                        finish(dict: response.result.value as? [String : AnyObject], error: nil)
                    }else{
                        
                        SVProgressHUD.showErrorWithStatus("    ,     ")
                        finish(dict: nil, error: response.result.error)
                    }
            }
        }
    
    ここでは、関数応答式プログラミング思想を利用して、request() によって引き出し、responseJson{ }に応答して、ここでは単純な思想であり、前の関数は第二の関数の使用者に戻って、直接に呼び出します.
    リターン値レスポンスのタイプはResponseの構造体で、内部に含まれています.
    public struct Response {
       //         
        public let request: NSURLRequest?
    //     
        public let response: NSHTTPURLResponse?
    //      
        public let data: NSData?
    //       -->        
        public let result: Result
    
        public init(request: NSURLRequest?, response: NSHTTPURLResponse?, data: NSData?, result: Result) {
            self.request = request
            self.response = response
            self.data = data
            self.result = result
        }
    }
    
    ```objc
    public enum Result {
        case Success(Value)
        case Failure(Error)
        /// Returns `true` if the result is a success, `false` otherwise.
    //      ,             ,     true ,         false
        public var isSuccess: Bool {
            switch self {
            case .Success:
                return true
            case .Failure:
                return false
            }
        }
        /// Returns `true` if the result is a failure, `false` otherwise.
        public var isFailure: Bool {
            return !isSuccess
        }
        /// Returns the associated value if the result is a success, `nil` otherwise.
    //      ,          ,               
    //                              
        public var value: Value? {
            switch self {
            case .Success(let value):
                return value
            case .Failure:
                return nil
            }
        }
        /// Returns the associated error value if the result is a failure, `nil` 
    otherwise.
    //      ,          error      ,          nil
        public var error: Error? {
            switch self {
            case .Success:
                return nil
            case .Failure(let error):
                return error
            }
        }
    }
    
    本当の大神は大神です.私はこのような構造体の書き方が書けないので、やはり多く勉強します.結果体についてはSwiftはもうとても強くなりました.結果体は完全に対象の創立に取って代わることができます.属性を作ったり、メモリを割り当てたりします.しかもSwiftは初期化コードをカプセル化することができます.
    ここに私のデータ処理のサンプルコードを貼ります.
        func getAllDepartmentRequest(deptName deptName: String?, finish:(dict: [String: AnyObject]?, error: NSError?) -> ()){
            let path = "mGetAllDeptB.htm"
            let parameter = ["deptName" : ""]
            request(.POST, baseURL + path, parameters: parameter).responseJSON { (response) -> Void in
    //     result  isSuccess         
                if response.result.isSuccess{
                    SVProgressHUD.dismiss()
                    LXLLOG(response)
    //    result   value          
                    let date = response.result.value as! [String : AnyObject]
                    let source = date["callBackData"]
                    LXLLOG(source)
    //         ,       ,         ,       ,  
                    finish(dict: response.result.value as? [String : AnyObject], error: nil)
                }else
                {
                    SVProgressHUD.showErrorWithStatus("      ,     ")
                    finish(dict: nil, error: response.result.error)
                }
            }
        }