【Swift】NSURLConnectionとNSURLSessitonを使ってYoutubeのAPI使ってデータを取得する。
まずはNSURLSessionバージョン。
orderは「data」にすれば公開日順、resultsCountはデータの取得数。
keyはGoogle Developer Console
Google Cloud Platformで取得してね。
class VideoItem: NSObject, NSURLSessionDelegate, NSURLSessionDataDelegate { func requestYoutubeVideoInfo(){ let encodedSearchWord:String! = searchWord.stringByAddingPercentEncodingWithAllowedCharacters(.URLHostAllowedCharacterSet()) //通信用のConfigを生成 let config: NSURLSessionConfiguration = NSURLSessionConfiguration.backgroundSessionConfigurationWithIdentifier("backgroundTask") //Sessionを生成 let session:NSURLSession = NSURLSession(configuration: config, delegate: self, delegateQueue: nil) //url let apiUrl:NSURL = NSURL(string: "https://www.googleapis.com/youtube/v3/search?key=\(YOUTUBE_API_KEY)&q=\(encodedSearchWord)&part=snippet&maxResults=\(resultsCount)&order=\(order)")! //タスクの生成 let task:NSURLSessionDataTask = session.dataTaskWithURL(apiUrl) //タスクの実行 task.resume() /* 通信が終了したときに呼び出されるデリゲート. */ func URLSession(session: NSURLSession, dataTask: NSURLSessionDataTask, didReceiveData data: NSData) { print("NSURLSessionDataTask") // 帰ってきたデータを文字列に変換. let myData:NSString = NSString(data: data, encoding: NSUTF8StringEncoding)! print("myData:\(myData)") // バックグラウンドだとUIの処理が出来ないので、メインスレッドでUIの処理を行わせる. dispatch_async(dispatch_get_main_queue(), { // self.myTextView.text = myData as String }) } /* バックグラウンドからフォアグラウンドの復帰時に呼び出されるデリゲート. */ func URLSessionDidFinishEventsForBackgroundURLSession(session: NSURLSession) { print("URLSessionDidFinishEventsForBackgroundURLSession") } } }
次にNSURLConnectionバージョン。
class VideoItem: NSObject { func requestYoutubeVideoInfo(){ //url let apiUrl:NSURL = NSURL(string: "https://www.googleapis.com/youtube/v3/search?key=\(YOUTUBE_API_KEY)&q=\(encodedSearchWord)&part=snippet&maxResults=\(resultsCount)&order=\(order)")! //リクエスト let requestUrl: NSURL = NSURL(string: apiUrl)! let req = NSURLRequest(URL: requestUrl) // NSURLConnectionを使ってアクセス NSURLConnection.sendAsynchronousRequest(req, queue: NSOperationQueue.mainQueue(), completionHandler: self.fetchResponse) } func fetchResponse(response: NSURLResponse?, data: NSData?, error: NSError?) { print("myData:\(myData)") } }
こんな感じかな。
分解の仕方は汚いけど
do{ let json: NSDictionary = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.AllowFragments) as! NSDictionary let itemArray: NSArray = json.objectForKey("items") as! NSArray for i in 0..<itemArray.count{ let items: NSDictionary = itemArray[i] as! NSDictionary let snippet: NSDictionary = items.objectForKey("snippet") as! NSDictionary print("結果 No.\(i)------------") //title let title: NSString = snippet.objectForKey("title") as! NSString print("title:\(title)") //description let description: NSString = snippet.objectForKey("description") as! NSString print("description:\(description)") //thumbnail image 120×90 320×180 480×360 let thumbnails: NSDictionary = snippet.objectForKey("thumbnails") as! NSDictionary let resolution: NSDictionary = thumbnails.objectForKey("default") as! NSDictionary let imageUrl: NSString = resolution.objectForKey("url") as! NSString print("imageUrl:\(imageUrl)") let id: NSDictionary! = items.objectForKey("id") as! NSDictionary if(id.objectForKey("videoId") != nil){ let videoId: NSString = id.objectForKey("videoId") as! NSString print("videoId:\(videoId)") }else{ } } } catch { //error }
こんな感じかな。
NSURLConnectionよりNSURLSesstionを使ったほうが良さそうだね。