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

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

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

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

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

Q&A

解決済

3回答

2353閲覧

[swift]別クラスへのjsonの渡し方

hideboow6

総合スコア35

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

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

0グッド

2クリップ

投稿2015/04/13 17:19

取得したJSONを他クラスでも利用できるようにしたく、下記コードを試してみましたがエラーとなります。

lang

1var weatherData = NSArray() 2 3override init() { 4 super.init() 5 loadWeatherData() 6} 7 8func loadWeatherData()->NSArray{ 9 Alamofire.request(.GET, "http://api.openweathermap.org/data/2.5/forecast?q=tokyo", parameters: nil, encoding:.JSON).responseJSON{(request,response,JSON,error)in 10 if error == nil{ 11 self.weatherData = JSON as NSArray 12 } 13 } 14 return self.weatherData 15} 16 17

おそらく下記ページの質問と同様かと思いますが、解決策がよくわかりませんでした。
リンク内容

どうすれば他クラスでも、取得したjsonを使えるようにできるのでしょうか。

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

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

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

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

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

guest

回答3

0

自己解決

okhd_gatewebさん、stsuneさん
雑な質問にもかかわらず回答いただきありがとうございます!

Aクラスをapiからjsonを取得するクラスとし、Bクラスにてそのデータを使用する構造としたかったのですが非同期通信でデータを取得し終える前に格納しようとしたのでエラーとなったのかな?と思います。

結果として、下記のようにNSNotificationCenterを使用することでクラス間でデータのやりとりができたので当質問は解決といたします。

Aクラス

lang

1var weatherData = NSMutableArray() 2 class var sharedInstance : LoadData { 3 struct Singleton{ 4 static var instance = LoadData() 5 } 6 return Singleton.instance 7 } 8 9 func loadWeatherData() { 10 let URL = NSURL(string: "http://api.openweathermap.org/data/2.5/weather?q=tokyo")! 11 var task = NSURLSession.sharedSession().dataTaskWithURL(URL,completionHandler:{data,response,error in 12 var json = JSON(data:data) 13 if error == nil{ 14 var cityName = json["name"].stringValue 15 var tempStr = json["main"]["temp"].stringValue 16 self.weatherData = [cityName,tempStr] 17 18 println("格納されたデータは:\(self.weatherData)") 19 }else{ 20 println("failed") 21 } 22 23 NSNotificationCenter.defaultCenter().postNotificationName("loadWeatherJSON",object:nil); 24 }) 25 task.resume() 26 } 27 28 func getArray()->NSMutableArray{ 29 return self.weatherData 30 } 31

Bクラス

lang

1 2 var weatherArray = NSMutableArray() 3 4 override func viewDidLoad() { 5 NSNotificationCenter.defaultCenter().addObserver(self, selector: "notificationDid:", name: "loadWeatherJSON", object: nil) 6 LoadData.sharedInstance.loadWeatherData() 7 8 super.viewDidLoad() 9 } 10 11 func notificationDid(notification:NSNotification?){ 12 self.weatherArray = LoadData.sharedInstance.getArray() 13 println("取得したデータ:\(weatherArray)") 14 } 15

投稿2015/04/16 10:05

hideboow6

総合スコア35

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

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

0

どういうエラー内容なのかわかりませんが、ぱっと見た感じの気になった点を…

responseJSONのクロージャ内でメインスレッドのobjectに対してアクセスしようとするからエラーになるのかなと。
dispatch_asyncなどを使ってメインスレッド呼び出し、そこでNSArrayに値を入れてみたらいかがでしょうか?

lang

1func loadWeatherData() { 2 Alamofire.request(.GET, "http://api.openweathermap.org/data/2.5/forecast?q=tokyo", parameters: nil, encoding:.JSON).responseJSON{(request,response,JSON,error)in 3 if error == nil{ 4 // この部分追加 5 dispatch_async(dispatch_get_main_queue(), { 6 self.weatherData = JSON as NSArray 7 }) 8 } 9 } 10}

外してたらすみません

投稿2015/04/15 00:17

stsune

総合スコア7

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

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

0

明らかに間違っている箇所だけ修正案を下記に記載します。
公式のライブラリではないので、なぜNSArrayを扱っているかは解りません。申し訳ない。

lang

1//var weatherData = NSArray() 2//↓ 3var weatherData : NSArray = loadWeatherData() as NSArray 4 5//↓loadWeatherData()を除外 6override init() { 7 super.init() 8}

投稿2015/04/13 19:06

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問