私は、Webサービスによって提供される項目のリストを記入したいtableViewを持っています。このサービスは、ステータス(成功または失敗)および表示(文字列の配列)を持つJSONオブジェクトを返します。 viewDidLoadでNSURLSessionタスクからインスタンス変数に値を取得するにはどうすればよいですか?
IメソッドはJSONオブジェクトを受信し、辞書にそれを置く
func getShowsFromService() {
// Send user data to server side
let myURL = NSURL(string: "https://myurl.com/srvc/shows.php")
// Create session instance
let session = NSURLSession.sharedSession()
var json:NSDictionary = [:]
// Create the task
let task = session.dataTaskWithURL(myURL!) { //.dataTaskWithRequest(request) {
(data, response, error) in
guard let data = data else {
print("Error: \(error!.code)")
print("\(error!.localizedDescription)")
return
}
do {
json = try NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions()) as! NSDictionary
} catch {
print (error)
}
let sts = json["status"] as! NSString
print("\(sts)")
}
// Resume the task so it starts
task.resume()
let shows = json["shows"] as! NSArray
for show in shows {
let thisshow = show as! String
showsArray.append(thisshow)
}
// Here I get "fatal error: unexpectedly found nil while unwrapping an Optional value"
}
)カスタムメソッドgetShowsFromService(呼び出します。次に、その辞書を使ってjson ['shows']を呼び出し、showsArrayというインスタンス変数に格納したい番組の配列を取得します。考え方は、データを書き込むために、tableView(cellForRowAtIndexPath)でshowsArrayを使用することです。
問題は、辞書を変数に入れることができないことです。私がタスクの中でそれをしようとすると、私はself.showsArrayを呼び出す必要があると言うエラーを受け取り、もしそうした場合、データは配列の中に入りません。私が仕事の外でそれをするなら、私はunwrapに無限の値を強制しようとしているので、私はエラーを出します。
タスク内で作成されたディクショナリをshowsArray varに出力するにはどうすればよいですか?
ヘルプDanielに感謝します。私はコードを使用してみましたが、json = let NSJSONSerialization.JSONObjectWithData(データ、オプション:NSJSONReadingOptions())を試してみましょう。 NSDictionary {私はエラーが発生します(条件付きバインディングの初期化子にはNSDictionaryではなくOptional型が必要です)。 – cesarcarlos
私は実際にその部分を修正して、そのデータをshowsArrayクラスのプロパティに取得することができました。問題は今、cellForRowAtIndexPathがこの配列からデータをロードしていないことです。アレイが構築されるまでに、cellForRowAtIndexPathが既に呼び出されている可能性がありますか? – cesarcarlos
あなたは大歓迎です!はい。データが取得されたときにリロードテーブルメソッドを呼び出すと、更新された内容がすぐに表示されるようにすることができます。私は答えを更新する –