読者です 読者をやめる 読者になる 読者になる

知行合一

とか言ってみる

【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を使ったほうが良さそうだね。