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

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

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

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

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

1回答

4443閲覧

SwiftでAPIリクエストを投げた後の処理順

wai21

総合スコア32

iOS

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

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2016/10/10 04:58

編集2016/10/10 07:13

###前提・実現したいこと
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

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

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

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

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

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

guest

回答1

0

ベストアンサー

taskで定義したクロージャ(in以下)が実行されるのは、http通信が完了したときです。
非同期処理でググってみてください。

投稿2016/10/10 10:24

編集2016/10/10 10:46
fromageblanc

総合スコア2724

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

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

wai21

2016/10/15 05:26

回答ありがとうございます。 同期処理/非同期処理の知識が足りなかったです。 調べた結果、想定通りの処理を行うことができました。 ご助言ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問