轉自: http://blog.csdn.net/C_calary/article/details/53193747
學習Swift 試着動手寫個天氣小app,搜集資料這個封裝還蠻好用的.
我用的第三方的版本是這樣的:
pod 'Alamofire', '~> 4.2.0'
pod 'SwiftyJSON', '~> 3.1.3'
import Foundation import UIKit import Alamofire import SwiftyJSON private let NetworkRequestShareInstance = NetworkRequest() class NetworkRequest { class var sharedInstance : NetworkRequest { return NetworkRequestShareInstance } } extension NetworkRequest { //MARK: - GET 請求 // let tools : NetworkRequest.shareInstance! func getRequest(urlString: String, params : [String : Any], success : @escaping (_ response : [String : AnyObject])->(), failture : @escaping (_ error : Error)->()) { //使用Alamofire進行網絡請求時,調用該方法的參數都是通過getRequest(urlString, params, success :, failture :)傳入的,而success傳入的其實是一個接受 [String : AnyObject]類型 返回void類型的函數 Alamofire.request(urlString, method: .get, parameters: params) .responseJSON { (response) in/*這里使用了閉包*/ //當請求后response是我們自定義的,這個變量用於接受服務器響應的信息 //使用switch判斷請求是否成功,也就是response的result switch response.result { case .success(let value): //當響應成功是,使用臨時變量value接受服務器返回的信息並判斷是否為[String: AnyObject]類型 如果是那么將其傳給其定義方法中的success // if let value = response.result.value as? [String: AnyObject] { success(value as! [String : AnyObject]) // } let json = JSON(value) PrintLog(json) case .failure(let error): failture(error) print("error:\(error)") } } } //MARK: - POST 請求 func postRequest(urlString : String, params : [String : Any], success : @escaping (_ response : [String : AnyObject])->(), failture : @escaping (_ error : Error)->()) { Alamofire.request(urlString, method: HTTPMethod.post, parameters: params).responseJSON { (response) in switch response.result{ case .success: if let value = response.result.value as? [String: AnyObject] { success(value) let json = JSON(value) PrintLog(json) } case .failure(let error): failture(error) PrintLog("error:\(error)") } } } //MARK: - 照片上傳 /// /// - Parameters: /// - urlString: 服務器地址 /// - params: ["flag":"","userId":""] - flag,userId 為必傳參數 /// flag - 666 信息上傳多張 -999 服務單上傳 -000 頭像上傳 /// - data: image轉換成Data /// - name: fileName /// - success: /// - failture: func upLoadImageRequest(urlString : String, params:[String:String], data: [Data], name: [String],success : @escaping (_ response : [String : AnyObject])->(), failture : @escaping (_ error : Error)->()){ let headers = ["content-type":"multipart/form-data"] Alamofire.upload( multipartFormData: { multipartFormData in //666多張圖片上傳 let flag = params["flag"] let userId = params["userId"] multipartFormData.append((flag?.data(using: String.Encoding.utf8)!)!, withName: "flag") multipartFormData.append( (userId?.data(using: String.Encoding.utf8)!)!, withName: "userId") for i in 0..<data.count { multipartFormData.append(data[i], withName: "appPhoto", fileName: name[i], mimeType: "image/png") } }, to: urlString, headers: headers, encodingCompletion: { encodingResult in switch encodingResult { case .success(let upload, _, _): upload.responseJSON { response in if let value = response.result.value as? [String: AnyObject]{ success(value) let json = JSON(value) PrintLog(json) } } case .failure(let encodingError): PrintLog(encodingError) failture(encodingError) } } ) } }
調用的方法也很簡單的,閉包傳值:
以下的接口是可以正常用的
NetWorkWeather.sharedInstance.getRequest(urlString: "http://op.juhe.cn/onebox/weather/query", params: ["cityname":"杭州","key":"f6418f1f819c801a60ea7880ca844587"], success: {(json) -> Void in print(json) }, failture: {(error) -> Void in print(error) })