###前提・実現したいこと
playgroundにてAPIのリクエストを作成、get、パースを行い、コンソールに出力する。
###発生している問題・エラーメッセージ
print()
にてメッセージを出して、実際にどのような順番で処理が行われているかを確認しておりますが、なぜこのような処理順になるのか、想定通りの処理順にするにはどうすべきかがわかりません。
getStationDataFromLineName()
のtask.resume
にて、タスクの作成、get、パース、コンソールへの出力を行なっています。
また、task.resume
の前後でprint()
にてメッセージを出力しています。
想定では、
①コンソールにresume前
を出力
②コンソールにパース結果を出力
③コンソールにresume後
を出力
でした。
しかし、実際には、
①コンソールにresume前
を出力
②コンソールにresume後
を出力
③コンソールにパース結果を出力
この処理順が何に起因し、どのようにすれば想定通りの処理順にすることができるのかわかりません。
ご教示ください。
###該当のソースコード
swift
1import UIKit 2import PlaygroundSupport 3 4//http://express.heartrails.com/api/json?method=getStations&line=JR山手線 5 6func getStationDataFromLineName() { 7 let urlString = "http://express.heartrails.com/api/json?method=getStations&line=JR山手線" 8 let encodedUrlString = urlString.addingPercentEncoding(withAllowedCharacters: NSCharacterSet.urlQueryAllowed) 9 print("encodedUrlString : \(encodedUrlString)") 10// var request = URLRequest(url: URL(string: urlString)!) 11 var request = URLRequest(url: URL(string: encodedUrlString!)!) 12 request.httpMethod = "GET" 13 14 let task = URLSession.shared.dataTask(with: request,completionHandler: { data, response, error in 15 if (error == nil) { 16 17 //ステータスコードの取得 18 let statusCode = (response as! HTTPURLResponse).statusCode 19 20 if statusCode == 200 { 21 let stationData = StationData() 22 stationData.convertFromData(data: data!) 23 stationData.printAllData() 24 25 } else { 26 print("エラー <ステータスコード : \(statusCode)>") 27 } 28 29 // let bookData = convertFromData(data: data!) 30 // printBookData(bookData: bookData) 31 32 } else { 33 print(error) 34 } 35 }) 36 print("resume前") 37 task.resume() 38 print("resume後") 39 40 PlaygroundPage.current.needsIndefiniteExecution = true 41} 42 43class StationData { 44 var line :String = "" 45 var station = Array<Station>() 46 class Station { 47 var name :String = "" 48 var prefecture :String = "" 49 var postal :String = "" 50 var x :Double = 0.0 51 var y :Double = 0.0 52 var prev :String = "" 53 var next :String = "" 54 } 55 56 //受け取ったデータを分解する 57 func convertFromData(data :Data) { 58 print("************************") 59 print("convertFromData スタート") 60 do { 61 let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as! NSDictionary 62 let json2 :Dictionary<String,AnyObject> = json["response"] as! Dictionary<String, AnyObject> 63 var results :Array<Dictionary<String,AnyObject>> = [] 64 results = json2["station"]! as! Array<Dictionary<String, AnyObject>> 65 for temp in results { 66 line = temp["line"]! as! String 67 let tempStation = StationData.Station() 68 tempStation.name = temp["name"]! as! String 69 tempStation.prefecture = temp["prefecture"]! as! String 70 tempStation.postal = temp["postal"]! as! String 71 tempStation.x = temp["x"]! as! Double 72 tempStation.y = temp["y"]! as! Double 73 tempStation.prev = temp["prev"]! as! String 74 tempStation.next = temp["next"]! as! String 75 self.station.append(tempStation) 76 } 77 } catch let err as NSError { 78 print(err.localizedDescription) 79 } 80 print("convertFromData エンド") 81 print("************************") 82 } 83 84 //各種情報をコンソールに出力する 85 func printAllData() { 86 print("************************") 87 print("printBookData スタート") 88 89 print("line : \(line)") 90 for temp in station { 91 print("name : \(temp.name)") 92 print("prefecture : \(temp.prefecture)") 93 print("postal : \(temp.postal)") 94 print("x : \(temp.x)") 95 print("y : \(temp.y)") 96 print("prev : \(temp.prev)") 97 print("next : \(temp.next)") 98 } 99 100 print("printBookData エンド") 101 print("************************") 102 } 103} 104 105getStationDataFromLineName() 106
###試したこと
課題に対してアプローチしたことを記載してください
###補足情報(言語/FW/ツール等のバージョンなど)
環境
swift 3.0
Xcode 8.0
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/10/15 05:26