Passion+Action+Sincerely=Success!

週末にのみ趣味でコーディングするおやじの備忘録

iTuneStoreのWeb serviceであるSearch APIを使ってみた

iTuneStoreのWeb serviceであるSearch APIを使ってみた。

 

しっかりとした仕様書を以下に発見したので、これに従って、swiftベースでNSURLSessionで Search APIをコールし、JSON形式のレスポンスを受信し、tableViewに検索結果として表示する実装をしてみた。

iTunes, App Store, iBooks, and Mac App Store Affiliate Resources - Search API

 

Step1. 以下のような感じで、検索キーワード(SearchText)と、検索対象(entity)を指定してURLを構築する。なお、SearchTest中にスペースを入れると飛んじゃうので、ちゃんとエスケープしないといけません。

 

-----コード抜粋------

func urlWithSearchText(searchText: String, category: Int) -> NSURL {

        var entityName: String

        switch category {

            case 1: entityName = "musicTrack"

            case 2: entityName = "software"

            case 3: entityName = "ebook"

            default: entityName = ""

        }

        

        let escapedSearchText =

            searchText.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)!

        

        let urlString = String(format:

            "http://itunes.apple.com/jp/search?term=%@&limit=200&entity=%@", escapedSearchText, entityName)

        let url = NSURL(string: urlString)

        return url!

    }

-------------

 

Step2. 以下のような感じで、NSURLSessionを使って、URLをコールする。

Responseは、JSON形式なので、JSONに含まれるwrapperTypeに従い、それぞれのケースのparserを作成した。SearchResult Object Arrayに順番にappendしていき(parseDictionary内で実装)、最後にtableViewに反映する(reloadData内で実装)。

 

------コード抜粋-----

let session = NSURLSession.sharedSession()

dataTask = session.dataTaskWithURL(url, completionHandler: {

                data, response, error in

                if let error = error {

                    println("Failure! (error)")

                    if error.code == -999 { return }

                } else if let httpResponse = response as? NSHTTPURLResponse {

                    if httpResponse.statusCode == 200 {

                        if let dictionary = self.parseJSON(data) {

                            self.searchResults = self.parseDictionary(dictionary)

                            dispatch_async(dispatch_get_main_queue()) {

                                self.isLoading = false

                                self.tableView.reloadData()

                            }

                            return

                        }

                    } else {

                        println("Failure! (response)")

                    }

                }   

                // UIのアップデートはメインスレッドでね!

                dispatch_async(dispatch_get_main_queue()) {

                    self.tableView.reloadData()

                    self.showNetworkError()

                }

})

dataTask?.resume()

------------

 

こんな感じにSwiftで検索すると、テイラースイフトだらけになった。

f:id:diinosimple:20141209005425p:plain

 

え!Objective-Cでは、NSURLSessionをそのまま使わず、AFNetworkingを使うのが主流なの?(ってエンジニアが言っていた気が。。。)

 

Swiftでは、Alamofireというlibraryがあることが分かった。ちなみにAFNetworkingを作った人と同じ人が作ったらしい。"AF"は、AlamofireのObjective-C命名規則に従った呼び方なんだな。この週末は、Alamofireを使って、通信周りをリファクタリングしてみようと思う。

 

以下に、参考になる資料発見。あー、週末が待ち遠しい。


Beginning Alamofire Tutorial - Ray Wenderlich