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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Swift

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

Swift 2

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

Q&A

解決済

3回答

2310閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

Swift

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

Swift 2

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

0グッド

0クリップ

投稿2016/03/13 08:38

編集2016/03/13 08:48

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

swift

1//NSData 2let URL:NSURL = NSURL(string: "http://json")! 3 let jsonData :NSData = NSData(contentsOfURL: URL)! 4 5 do { 6 json = try NSJSONSerialization.JSONObjectWithData(jsonData, options: .MutableContainers) as! NSDictionary 7 } catch { 8 9 } 10 11 12//NSURLSession 13 let url = NSURL(string: "http://json")! 14 let task = NSURLSession.sharedSession().dataTaskWithURL(url, 15 completionHandler: { data, response, error in 16 do { 17 let dict = try NSJSONSerialization.JSONObjectWithData(data!, 18 options: NSJSONReadingOptions.MutableContainers) as! NSDictionary 19 20 } catch {} 21 22 dispatch_async(dispatch_get_main_queue(), { 23 24 self.tableView.reloadData() 25 }) 26 }) 27 task!.resume() 28}

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

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

投稿2016/03/13 09:10

Stripe

総合スコア2183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/03/13 12:46

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

2016/03/13 12:53

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

退会済みユーザー

2016/03/13 20:49

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

2016/03/13 22:36

+ dataWithContentsOfURL:メソッドの注意書きの中です。
退会済みユーザー

退会済みユーザー

2016/03/14 09:07

ありがとうございました。
退会済みユーザー

退会済みユーザー

2016/04/09 20:47

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

0

ベストアンサー

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

投稿2016/03/16 11:45

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TakeOne

2016/03/16 15:15

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

退会済みユーザー

2016/03/16 20:09

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

0

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

投稿2016/03/16 11:42

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問