之前的http的代码如下:
//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了。
暂时改为:
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)
}
}调用方式:
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)") //
。。。
}
}
}[后记]
之后,经过无数次改进后,变为:
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)
}
}调用方式:
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网络请求部分的代码