最新消息:20210816 当前crifan.com域名已被污染,为防止失联,请关注(页面右下角的)公众号

[基本解决]swift优化http网络请求部分的代码

Swift crifan 3076浏览 0评论

之前的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 NSURLConnection sendSynchronousRequest replacement
参考:
搜:
swift dataTaskWithRequest
参考:
搜:
swift datataskwithrequest synchronous
参考:
-》
结论:
应该完全避免使用同步的HTTP
而改用异步的HTTP请求
想办法,优化如何使用异步的http
-》暂时还是使用Swift HTTP
-》或者使用自带的API:
NSURLSession的dataTaskWithRequest去完成异步请求
因为它支持callback
->后来自己研究代码后发现,Swift HTTP也是支持completionHandler的:
swift completionHandler http response
-》如此,就可以去封装一个函数,填入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网络请求部分的代码

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
86 queries in 0.408 seconds, using 22.28MB memory