Apple SwiftでのIOS8アプリ開発

この記事は、「 Meet Swift! 」という記事の続きです。Helectaによる記事と、 Swiftチュートリアルを使用したiOSアプリの開発パート2の無料翻訳。







そのため、最初の記事では、いくつかのセルを持つテーブルを含むシンプルなシングルビューアプリケーションを作成しました。

今回はもう少し深く、もっと野心的なことをします。 iTunesの検索APIにアクセスし、JSONで受信した応答を解析して、結果をテーブルビューに表示します。

一見すると、これはかなり複雑で、やるべきことがたくさんありますが、実際にはそうではありません。 上記のすべてはiOSアプリケーションの非常にシンプルな機能であり、自尊心のあるiOS開発者は誰でもできるはずです。



テーブルビューが追加されたシングルビューアプリケーションが必要になります。 これについては、最初の記事で非常に簡単に説明しているため、ここでは説明しません。



インターフェース接続



始めるには、アプリケーションコードで使用するためにテーブルビューへのポインタを取得する必要があります。 ViewController.swiftファイルに移動し、すぐにクラスの初期化(クラスViewController:UIViewController、UITableViewDataSource、UITableViewDelegate {)で次の行を追加します。

@IBOutlet var appsTableView : UITableView
      
      





これにより、ストーリーボードのテーブルビューを変数「appsTableView」に関連付けることができます。

ストーリーボードに渡します。 コントロールを押したままView Controllerをクリックし、カーソルをTable Viewにドラッグして、これらのオブジェクトをリンクします。 表示される[アウトレット]メニューで、「appsTableView」を選択します。





API実行のリクエスト



これで、インターフェイスを接続した後、APIリクエストを実行できます。

ViewControllerクラスの初期化内のViewController.swiftファイルで、searchItunesFor(searchTerm:String)関数を作成します。

 func searchItunesFor(searchTerm: String) { //  The iTunes API          "+",      . var itunesSearchTerm = searchTerm.stringByReplacingOccurrencesOfString(" ", withString: "+", options: NSStringCompareOptions.CaseInsensitiveSearch, range: nil) //  ,      URL-friendly var escapedSearchTerm = itunesSearchTerm.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding) var urlPath = "https://itunes.apple.com/search?term=\(escapedSearchTerm)&media=software" var url: NSURL = NSURL(string: urlPath) var session = NSURLSession.sharedSession() var task = session.dataTaskWithURL(url, completionHandler: {data, response, error -> Void in println("Task completed") if(error) { println(error.localizedDescription) } var err: NSError? var jsonResult = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &err) as NSDictionary if(err?) { println(error.localizedDescription) } var results: NSArray = jsonResult["results"] as NSArray dispatch_async(dispatch_get_main_queue(), { self.tableData = results self.appsTableView.reloadData() }) }) task.resume() }
      
      







順番に行きましょう。

iTunes APIが「First%20Second%20 ...」ではなく「First + Second + Third + Words」という形式のテキストを受け取るように、検索クエリを修正します。 これを行うには、NSStringで使用可能なstringByReplacingOccurencesOfStringメソッドを使用します。このメソッドは、スペースを「+」に置き換えます。

次に、結果の文字列を、URLでサポートされていない文字からクリアします。

次の2行は、APIへのリクエストとして使用されるNSURLオブジェクトを定義します。

次の2行に注意しましょう。

 var session = NSURLSession.sharedSession() var task = session.dataTaskWithURL(url, completionHandler: {data, response, error -> Void in
      
      





1つ目は、ネットワーク呼び出しに使用される標準のNSURLSessionオブジェクトを取得します。

2番目は、リクエストを送信するタスクを作成します。

最後に、task.resume()行がリクエストの実行を開始します。



応答を受信する準備



呼び出されたときに、iTunesで検索を実行するメソッドを取得しました。 ViewControllerのviewDidLoadメソッドの最後に挿入します。

 override func viewDidLoad() { super.viewDidLoad() searchItunesFor("Angry Birds") }
      
      





ここで、答えを得るために、検索結果を保存するオブジェクトを追加する必要があります。

したがって、NSMutableDataインスタンスとNSArray配列を追加して、テーブルのデータを保存します(たとえば、@ IBOutletポインター変数appsTableView:UITableViewの直後のViewControllerクラスの初期化内)。

 var data: NSMutableData = NSMutableData() var tableData: NSArray = NSArray()
      
      





ここで、NSURLConnectionがクラスに送信する関数を組み合わせてみましょう。 これはリクエストのデリゲートであるため、NSURLConnectionからの情報はすべて、NSURLConnectionDataDelegateおよびNSURLConnectionDelegateで定義されたプロトコルメソッドによって返されます。 したがって、ViewControllerの初期化では、NSURLConnectionDelegate、NSURLConnectionDataDelegateも指定します。次のようなものがあります。

 class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, NSURLConnectionDelegate, NSURLConnectionDataDelegate {
      
      







応答を受け取る



受信した情報を処理するには、アプリケーションコードの大部分を追加する必要があります。

 func connection(didReceiveResponse: NSURLConnection!, didReceiveResponse response: NSURLResponse!) { self.data = NSMutableData() } func connection(connection: NSURLConnection!, didReceiveData data: NSData!) { self.data.appendData(data) } func connectionDidFinishLoading(connection: NSURLConnection!) { var err: NSError var jsonResult: NSDictionary = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as NSDictionary if jsonResult.count>0 && jsonResult["results"].count>0 { var results: NSArray = jsonResult["results"] as NSArray self.tableData = results self.appsTableView.reloadData() } }
      
      





NSURLConnectionが応答を受信すると、didReceiveResponseメソッドが呼び出されます。

ここでは、self.data = NSMutableData()を記述して新しいオブジェクトを作成することにより、データがあればそれを単にダンプします。

接続が確立された後、didReceiveDataメソッドでデータの受信を開始します。 ここで、引数にデータが渡されます:NSData、ここには、関心のあるすべての情報があります。 レスポンスで受け取ったすべてのパーツを保存する必要があるため、上記で作成したself.dataオブジェクトにアタッチします。

最後に、応答ですべての情報を受け取った後、connectionDidFinishLoadingメソッドが呼び出されます。このメソッドでは、結果の使用を開始できます。

NSJSONSerializationクラスを使用して、生データをNSDictionary辞書オブジェクトの形式の有用な情報に変換します。

iTunesから何らかの応答を受け取ったことを確認したので、「結果」キーを簡単にチェックするだけで、期待どおりの結果が得られたことを確認できるため、self.tableDataオブジェクトを結果に設定し、メソッドも参照できます。テーブルappsTableView.reloadData()でコンテンツを更新します。



テーブルビューUIの更新



最初の記事でテーブルビューを初期化するには、2つの関数を定義する必要がありました。1つはテーブル内の行数を返し、2つ目はセルを作成してその内容を記述しました。

これらの機能は、新しい機能に従って更新されます。

 func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int { return tableData.count } func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! { let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "MyTestCell") var rowData: NSDictionary = self.tableData[indexPath.row] as NSDictionary cell.text = rowData["trackName"] as String //    artworkUrl60       var urlString: NSString = rowData["artworkUrl60"] as NSString var imgURL: NSURL = NSURL(string: urlString) //      NSData      var imgData: NSData = NSData(contentsOfURL: imgURL) cell.image = UIImage(data: imgData) //      formattedPrice      subtitle var formattedPrice: NSString = rowData["formattedPrice"] as NSString cell.detailTextLabel.text = formattedPrice return cell }
      
      





numberOfRowsInSection関数は、応答で受信したオブジェクトの数を単に返すようになりました。

cellForRowAtIndexPath関数は、行番号を表示する代わりに、オブジェクトの名前、そのカバー、および値を表示するようになりました。



すべてが正常であり、アプリケーションを実行できた場合、その動作中に「遅れ」に気付くことがあります。 これは、次の記事で注意するいくつかのことを提供しなかったためです。



PS:翻訳のリリース後、著者はレッスンを多少更新し、コードを少し最適化しました。 翻訳を並べようとしました。



All Articles