質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.51%

  • Swift

    8756questions

    Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

  • Swift 2

    1339questions

    Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

swiftでjsonをパースする時にNSURLSessionを使うのかNSDataを使うのか

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,175
退会済みユーザー

退会済みユーザー

swiftでAPIを叩いてjsonをパースする時にNSURLSessionを使うのかNSDataを使う時はどう判断すれば良いのでしょうか。どちらでもパースできデータは取得表示できるのですが、なんだか使う場面の想定ができません。NSDataの方が使いやすいのでそちらで全てまかなえるのでしょうか。教えていただきたいです。よろしくお願いします。

//NSData
let URL:NSURL = NSURL(string: "http://json")!
        let jsonData :NSData = NSData(contentsOfURL: URL)!

        do {
            json = try NSJSONSerialization.JSONObjectWithData(jsonData, options: .MutableContainers) as! NSDictionary
        } catch  {

        }


//NSURLSession
 let url = NSURL(string:  "http://json")!
  let task = NSURLSession.sharedSession().dataTaskWithURL(url,
    completionHandler: { data, response, error in
    do {
      let dict = try NSJSONSerialization.JSONObjectWithData(data!,
          options: NSJSONReadingOptions.MutableContainers) as! NSDictionary

    } catch {}

    dispatch_async(dispatch_get_main_queue(), {

      self.tableView.reloadData()
    }) 
  })
  task!.resume()
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

0

NSData(contentsOfURL:)はローカルファイル読み込むためのものです。
これを使ってネットワークからダウンロードするのは非推奨です。
ネットワークからダウンロードする場合は、NSURLSessionを使ってください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/03/13 21:46

    コメントありがとうございます。
    NSDataでもネットワークからはダウンロード非推奨にはなっていないと思いますがどうなんでしょうか。

    キャンセル

  • 2016/03/13 21:53

    NSDataのAPIリファレンスに「Do not use this synchronous method to request network-based URLs.」とはっきり書かれています。

    キャンセル

  • 2016/03/14 05:49

    NSData Class Referenceでは見当たらないですがどこの記述があるのでしょうか。すみません教えていただけますか?

    キャンセル

  • 2016/03/14 07:36

    + dataWithContentsOfURL:メソッドの注意書きの中です。

    キャンセル

  • 2016/03/14 18:07

    ありがとうございました。

    キャンセル

  • 2016/04/10 05:47

    ネットワークからダウンロードするのも安全を確認すれば可能です。

    キャンセル

check解決した方法

-3

NSURLSession、NSDataどちらも使用可能であるがバックグラウンド処理を優先的にする場合はNSURLSessionが必須。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/03/17 00:15

    AppleがなぜNSData(contentsOfURL:)でネットワーク(サーバー)からデータをダウンロードするのを非推奨としているのか理解できてないように思います。

    NSData(contentsOfURL:)は同期型のメソッドですから、サーバーからのデータ受信をこのメソッドの内部で待ち合わせます。通信環境がよい場合は、すぐにデータを取得してこのメソッドはすぐ戻ってきますが、キャリアの電波状態が悪い場合やサーバーがパンクしている場合等、データが戻ってこない場合は、このメソッドの内部でデータ受信をずっと待ち合わせることになります。もしNSData(contentsOfURL:)をメインスレッドで実行していると、メインスレッドの処理全体が止まってしまうため、一切のGUI操作ができなくなり、ユーザーにはアプリがハングアップして固まったように見えます。
    そういうことを考慮して、同期型のメソッドで受信データを待ち合わせることは避け、NSURLSessionを使って非同期にデータを受信する構造で設計すべきだということです。

    キャンセル

  • 2016/03/17 05:09

    コメントありがとうございます。ご指摘のように理解しています。

    キャンセル

-3

NSData(contentsOfURL:url)を使用してNSDataでjsonをパースをすることは可能、有効。
NSURLSessionはバックグラウンド処理が必要な場合に使用。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • Swift

    8756questions

    Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

  • Swift 2

    1339questions

    Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。