【Swift】iOSの通信について【GET, POST】
iosで通信処理を実装する方法です。
Androidですと、
threadを作って、そこに通信処理と、コールバック関数を無名クラスで作成したりしますよね。
ではiOSではどうなんでしょう
◆一番単純な書き方
class ViewController: UIViewController { override func viewDidLoad() { .... //urlを生成 let url:NSURL = NSURL(string:"http://xxx.com")! //リクエストを生成 let request:NSURLRequest = NSURLRequest(URL: url) //リクエストを投げる self.getHttpはレスポンス取得後の処理 NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue(), completionHandler: self.getHttp) } //レスポンス取得後の処理 func getHttp(response:NSURLResponse?,data:NSData?,error:NSError?){ print( NSString(data: data!, encoding: NSUTF8StringEncoding)! ); }
NSOperationQueue.mainQueue()部分がThread部分です。
Androidのように自分で作る必要はなく、あらかじめ用意されたキューを指定します。
この場合はメインスレッドを指定しています。
◆1つの関数内で完結させる
また上記の書き方ではコールバックを別の関数として書いていますが
Swiftの場合、無名関数で書くことが出来ます。
こんな感じ
let url:NSURL = NSURL(string:"http://xxx.com")! let request:NSURLRequest = NSURLRequest(URL: url) NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue(), completionHandler: {(response:NSURLResponse?, data:NSData?, error:NSError? ) in print(NSString(data: data!, encoding: NSUTF8StringEncoding)!) } )
◆POST通信
NSURLRequestの代わりに、NSMutableURLRequestを使用するとPOSTを送ることができます。
let query = "param1=1¶m2=abc¶m3=test" let url:NSURL = NSURL(string:"http://xxx.com")! let request = NSMutableURLRequest(URL: url!) request.HTTPMethod = "POST" request.HTTPBody = query.dataUsingEncoding(NSUTF8StringEncoding) NSURLConnection.sendAsynchronousRequest(apiRequest, queue: NSOperationQueue.mainQueue(), completionHandler: {(response:NSURLResponse?, data:NSData?, error:NSError? ) in print( NSString(data: data!, encoding: NSUTF8StringEncoding)! ) } )
以上です。
Androidに比べてスマートに書くことができますね。