之前的http的代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | //Synchronous request, to get url response json dict func getUrlRespJsonDict(url:String) -> JSON? { print( "getUrlRespJsonDict: url=\(url)" ) var decodedJsonDict:JSON? let fullNsurl: NSURL = NSURL(string: url)! print( "fullNsurl=\(fullNsurl)" ) // let urlReq: NSURLRequest = NSURLRequest(URL: fullNsurl) let mutableUrlReq:NSMutableURLRequest = NSMutableURLRequest(URL: fullNsurl) //add header // mutableUrlReq.HTTPBody = NSJSONSerialization.dataWithJSONObject(params, options: nil, error: &err) mutableUrlReq.addValue( "application/json" , forHTTPHeaderField: "Content-Type" ) mutableUrlReq.addValue( "application/json" , forHTTPHeaderField: "Accept" ) print( "mutableUrlReq=\(mutableUrlReq)" ) do { let response: AutoreleasingUnsafeMutablePointer<NSURLResponse? >= nil let respJsonData: NSData = try NSURLConnection.sendSynchronousRequest(mutableUrlReq, returningResponse: response) decodedJsonDict = JSON(data: respJsonData) print( "decodedJsonDict=\(decodedJsonDict)" ) } catch let httpGetErr { print( "httpGetErr=\(httpGetErr)" ) decodedJsonDict = nil } return decodedJsonDict } |
现在需要优化:
根据iOS版本不同,决定是否继续用sendSynchronousRequest还是换其他函数
-》因为sendSynchronousRequest已经在iOS 9中废弃不用了
搜:
swift NSMutableURLRequest
swift URL Loading System Programming Guide
参考:
搜:
swift NSURLConnection
参考:
搜:
swift NSURLConnection sendSynchronousRequest replacement
参考:
搜:
swift dataTaskWithRequest
参考:
搜:
swift datataskwithrequest synchronous
参考:
-》
结论:
应该完全避免使用同步的HTTP
而改用异步的HTTP请求
想办法,优化如何使用异步的http
-》暂时还是使用Swift HTTP
-》或者使用自带的API:
NSURLSession的dataTaskWithRequest去完成异步请求
因为它支持callback
->后来自己研究代码后发现,Swift HTTP也是支持completionHandler的:

-》如此,就可以去封装一个函数,填入callback了。
暂时改为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | func getUrlRespJsonDict_async(url:String, extraParas:AnyObject?, respJsonDictHandler:((Bool, AnyObject?, JSON) -> Void)) { print( "url=\(url)" ) var getJsonOk:Bool = false let params:Dictionary<String, AnyObject>? = nil do { let opt = try HTTP.GET( url, parameters: params, requestSerializer: JSONParameterSerializer()) opt.start { response in if let err = response.error { print( "error: \(err.localizedDescription)" ) getJsonOk = false let errJsonDict = JSON([ "error" : err.localizedDescription]) respJsonDictHandler(getJsonOk, extraParas, errJsonDict) return } print( "response.statusCode=\(response.statusCode)" ) print( "opt finished: \(response.description)" ) let decodedJsonDict:JSON = JSON(data: response.data) print( "decodedJsonDict=\(decodedJsonDict)" ) getJsonOk = true respJsonDictHandler(getJsonOk, extraParas, decodedJsonDict) } } catch let httpGetError { NSLog( "http get url=\(url) with params=\(params) got error= \(httpGetError)" ) getJsonOk = false let errJsonDict = JSON([ "error" : "\(httpGetError)" ]) respJsonDictHandler(getJsonOk, extraParas, errJsonDict) } } |
调用方式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | let getContactIdListUrl:String = StrServerUrl + "/user/" + userIdStr + "/teams/joined/" + teamIdStr + "/members" let userTeamInfoDict:[String:String] = [ "userIdStr" :userIdStr, "teamIdStr" :teamIdStr] getUrlRespJsonDict_async(getContactIdListUrl, extraParas: userTeamInfoDict, respJsonDictHandler: contactIdListJsonDictHandler) func contactIdListJsonDictHandler(getJsonOk:Bool, extraParas:AnyObject?, respJsonDict:JSON){ if getJsonOk { var contactIdList:[String] = [String]() contactIdList = respJsonDict.arrayObject as! [String] print( "contactIdList=\(contactIdList)" ) // 。。。 } } } |
[后记]
之后,经过无数次改进后,变为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 | func getUrlRespJsonDict_async(url:String, extraParas:AnyObject?, respJsonDictHandler:((Bool, AnyObject?, JSON) -> Void)) { gLog.debug( "url=\(url), extraParas=\(extraParas), respJsonDictHandler=\(respJsonDictHandler)" ) var extraParas = extraParas var getJsonOk:Bool = false var params:Dictionary<String, AnyObject>? = nil var headers:Dictionary<String, String>? = nil var opt:HTTP? = nil var httpVerb:String? = nil if extraParas != nil { if extraParas is Dictionary<String, AnyObject> { extraParas = extraParas as! Dictionary<String, AnyObject> if let httpParams = extraParas![ "httpParams" ] { gLog.debug( "httpParams=\(httpParams)" ) if httpParams != nil { params = httpParams as? Dictionary<String, AnyObject> //Optional(["Authorization": Basic dXNlci04N2YzYWRkOS1iMTJlLTQ3OWMtYjE1NS02MWQ3MzMzNjZkY2Y6MTExMTEx]) //Optional(["text": To bl]) //Optional(["last": message-36dda308-be05-4769-be0d-51ed1cd511ef, "date": 20151212]) //Optional(["topic": false, "desc": 聊聊职业生涯规划,欢迎大家围观哦, "name": 职业生涯规划]) } } if let httpHeaders = extraParas![ "httpHeaders" ] { gLog.debug( "httpHeaders=\(httpHeaders)" ) if httpHeaders != nil { headers = httpHeaders as? Dictionary<String, String> /* get token: Optional({ Authorization = "Basic dXNlci04N2YzYWRkOS1iMTJlLTQ3OWMtYjE1NS02MWQ3MzMzNjZkY2Y6MTExMTEx"; }) */ /* follow url will require token header: authenticate: token xxxxxx */ } } if let httpVerbStr = extraParas![ "httpVerb" ] { gLog.debug( "httpVerbStr=\(httpVerbStr)" ) //Note: httpVerbStr is nil, but code still can go into here!!! httpVerb = httpVerbStr as? String //Optional("POST") //nil //Optional("PUT") } } } if !gCurUserItem.accessToken.isEmpty { if headers == nil { headers = Dictionary<String, String>() headers![ "authenticate" ] = "token " + gCurUserItem.accessToken } else { headers![ "authenticate" ] = "token " + gCurUserItem.accessToken } gLog.debug( "headers=\(headers)" ) //headers=Optional(["authenticate": "token 7au5urb4cqp2oeb6uidcgbnk7m"]) } do { if (httpVerb != nil) && !(httpVerb!.isEmpty) { switch httpVerb!{ case String(HTTPVerb.GET): opt = try HTTP.GET( url, parameters: params, headers: headers, requestSerializer: JSONParameterSerializer()) case String(HTTPVerb.POST): opt = try HTTP.POST( url, parameters: params, headers: headers, requestSerializer: JSONParameterSerializer()) case String(HTTPVerb.PUT): opt = try HTTP.PUT( url, parameters: params, headers: headers, requestSerializer: JSONParameterSerializer()) case String(HTTPVerb.DELETE): opt = try HTTP.DELETE( url, parameters: params, headers: headers, requestSerializer: JSONParameterSerializer()) default : opt = try HTTP.GET( url, parameters: params, headers: headers, requestSerializer: JSONParameterSerializer()) } } else { opt = try HTTP.GET( url, parameters: params, headers: headers, requestSerializer: JSONParameterSerializer()) } opt!.start { response in if let err = response.error { gLog.error( "url=\(url) with params=\(params) response error= \(response.statusCode) \(err.localizedDescription)" ) getJsonOk = false var errorStr:String = "Unkown error" let respErrorJsonDict:JSON = JSON(data: response.data) if let errorMessage = respErrorJsonDict[ "message" ].string { errorStr = errorMessage } else { errorStr = err.localizedDescription } //let errJsonDict = JSON(["error" : errorStr]) var errorDict:[String:AnyObject] = [ "error" : errorStr] if let statusCode = response.statusCode { errorDict[ "statusCode" ] = statusCode } let errJsonDict = JSON(errorDict) respJsonDictHandler(getJsonOk, extraParas, errJsonDict) return } //print("response.statusCode=\(response.statusCode)") //print("opt finished: \(response.description)") let respJsonDict:JSON let decodedJsonDict:JSON = JSON(data: response.data) // print("decodedJsonDict=\(decodedJsonDict)") /* { "data" : "user-a55eaa80-419f-46ac-aa56-a03d37e05854", "message" : "ok", "code" : 200 } */ //get sub field "data" json data //both string or dictonary all ok let decodedDataJsonDict:JSON = JSON(decodedJsonDict[ "data" ].object) //gLog.debug("decodedDataJsonDict=\(decodedDataJsonDict)") respJsonDict = decodedDataJsonDict getJsonOk = true respJsonDictHandler(getJsonOk, extraParas, respJsonDict) } } catch let httpGetError { gLog.error( "url=\(url) with params=\(params) got error= \(httpGetError)" ) getJsonOk = false let errJsonDict = JSON([ "error" : "\(httpGetError)" ]) respJsonDictHandler(getJsonOk, extraParas, errJsonDict) } } |
调用方式:
1 2 3 4 5 6 7 8 9 10 11 12 13 | let getUserIdUrl = StrServerUrl + "/user?phone=" + userPhoneNumber print( "getUserIdUrl=\(getUserIdUrl)" ) getUrlRespJsonDict_async(getUserIdUrl, extraParas: nil, respJsonDictHandler: getUserIdJsonDictHandler) func getUserIdJsonDictHandler(getJsonOk:Bool, extraParas:AnyObject?, jsonDict:JSON) { if getJsonOk { if let respUserId = jsonDict.string { print( "got user id [\(respUserId)] from phone [\(self.searchTextField.text!)]" ) } } else { addUserFail( "不存在此注册用户!" ) } } |
转载请注明:在路上 » [基本解决]swift优化http网络请求部分的代码