Alex Liang

iOS基礎Networking處理

幾乎所有的APP都需要連網抓取/上傳資料的功能,這篇文章記錄networking基本的處理。

以dataTaskWithRequest取得網路連線

1
2
3
4
5
6
7
8
9
let url = NSURL(string: "https://itunes.apple.com/search?term=apple&media=software")
let urlRequest = NSURLRequest(URL: url!, cachePolicy: .ReturnCacheDataElseLoad, timeoutInterval: 30)
let task = NSURLSession.sharedSession().dataTaskWithRequest(urlRequest) {
(data:NSData?, res:NSURLResponse?, err:NSError?) -> Void in
if let data = data {
let dataStr = NSString(data: data, encoding: NSUTF8StringEncoding)
}
}
task.resume()

首先得設定URL的字串,然後建立連線請求,這裡需要設定cache的使用方式和timeout的時間。以此例來說,假如cache己有先前的資料,則直接使用;而timeout設為30秒後觸發。

接著使用dataTaskWithRequest將連線抓取的資料做處理,這裡用到closure,我們可以把處理資料的部分寫成function,可增加使用上的彈性。最後記得執行task

dataTaskWithURL

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
let url = NSURL(string: "https://itunes.apple.com/search?term=apple&media=software") 
let task = NSURLSession.sharedSession().dataTaskWithURL(url!) {
data, res, err in
if let data = data {
do {
let dic = try NSJSONSerialization.JSONObjectWithData(data, options: .MutableContainers) as! NSDictionary
let array = dic["results"] as! NSArray

for appDic in array {
print("trackName \(appDic["trackName"])")
}
} catch {

}
}
}
task.resume()

這裡省略NSURLRequest,直接對NSURL做連線抓資料的動作
抓下來是是json格式的資料,所以我們得做序列化的動作並轉換成NSArray的型式
最後將results下所有trackName印出來

利用downloadTaskWithRequest將資料存在local端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
let url = NSURL(string: "https://itunes.apple.com/search?term=apple&media=software") 
let urlRequest = NSURLRequest(URL: url!, cachePolicy: .ReturnCacheDataElseLoad, timeoutInterval: 30)

let task = NSURLSession.sharedSession().downloadTaskWithRequest(urlRequest) {
(location:NSURL?, res:NSURLResponse?, err:NSError?) -> Void in if let location = location {
let data = NSData(contentsOfURL: location)
if let data = data {
do {
let dic = try NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers) as! NSDictionary
let array = dic["results"] as! NSArray

for appDic in array {
print("trackName \(appDic["trackName"])")
}
} catch { }
}
}
}
task.resume()

這裡task的closure把資料存在location中,而location為local路徑,所以需要使用NSData存取。

NSURLSessionConfiguration

可以獨立設定URLSession的config,例如timeout和cache

1
2
3
4
5
6
7
8
9
10
11
12
let sessionConfiguration = NSURLSessionConfiguration.defaultSessionConfiguration() 
sessionConfiguration.timeoutIntervalForRequest = 1
let session = NSURLSession(configuration: sessionConfiguration)

let url = NSURL(string: "https://itunes.apple.com/search?term=apple&media=software")
let urlRequest = NSURLRequest(URL: url!)
let task = session.dataTaskWithRequest(urlRequest) {
data, res, err in

// something to do
}
task.resume()

利用NSURLSessionUploadTask上傳資料

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
let url = NSURL(string: "https://www.peter.com") 
let urlRequest = NSMutableURLRequest(URL: url!)
urlRequest.HTTPMethod = "POST"

let postStr = "name=peter&grade=99"
let data = postStr.dataUsingEncoding(NSUTF8StringEncoding)

let task = NSURLSession.sharedSession().uploadTaskWithRequest(urlRequest, fromData: data) {
returnData, res, err in
if let returnData = returnData {
do {
let dic = try NSJSONSerialization.JSONObjectWithData(returnData , options: .MutableContainers) as! NSDictionary
let status = dic["success"] as? NSNumber
if status!.intValue == 1 {
print("success")
}
} catch {
}
}
}
task.resume()

先設定URLRequest的http method為post,再將想上傳的資料編碼為NSUTF8StringEncoding格式
接下來使用uploadTaskWithRequest上傳資料

利用NSURLSessionDataTask上傳資料

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
let url = NSURL(string: "https://www.peter.com") 
let urlRequest = NSMutableURLRequest(URL: url!)
urlRequest.HTTPMethod = "POST"

let postStr = "name=peter&grade=99"
let data = postStr.dataUsingEncoding(NSUTF8StringEncoding) urlRequest.HTTPBody = data

let task = NSURLSession.sharedSession().dataTaskWithRequest(urlRequest) {
returnData, res, err in
if let returnData = returnData {
do {
let dic = try NSJSONSerialization.JSONObjectWithData(returnData , options: NSJSONReadingOptions.MutableContainers) as! NSDictionary
let status = dic["success"] as? NSNumber
if status!.intValue == 1 {
print("success")
}
} catch {
}
}
}
task.resume()

可以將資料放進NSURLRequest的HTTPBody裡並上傳

利用NSURLSessionUploadTask上傳json格式資料

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
let url = NSURL(string: "https://www.peter.com") 
let urlRequest = NSMutableURLRequest(URL: url!)
urlRequest.HTTPMethod = "POST"
urlRequest.setValue("application/json", forKey: "Content-Type")
let dictionary = ["name": "penny", "grade":"77"]

do {
let data = try NSJSONSerialization.dataWithJSONObject(dictionary, options: [])
let task = NSURLSession.sharedSession().uploadTaskWithRequest(urlRequest, fromData: data) {
(returnData, res, err:NSError?) -> Void in
// do something
}
} catch {

}
task.resume()

#