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

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

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

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

Swift 2

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

解決済

処理の完了を待ってから次の処理を行いたい

nosusu
nosusu

総合スコア21

Swift

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

Swift 2

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

1回答

0評価

0クリップ

7847閲覧

投稿2018/01/06 07:53

編集2018/01/06 08:38

###前提・実現したいこと
iOSアプリケーションの改造をしています。
apiから値を取得しにいくうちに画面が進んでしまい、別の処理が動いてしまいます。
取得した値によって処理を変えたいのですが、同期・非同期の処理をどのようにいれるのが
正しい(というか一般的?)のかがわかりません。
普通はこのようにするものだ、というものがありましたら教えていただきたいです。

###該当のソースコード

swift

AppDelegate.swift func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool { //apiからデータを取得する //ここで行う処理を待ってから次へ行きたい    getMemberInfo()    //取得したデータをもとに処理を行う ... //データ取得する前にhogeViewControllerの中の処理が動いてしまう window?.rootViewController = hogeViewController } func getMemberInfo(){ //共通で使うAPI呼び出し部分 let ret: [AnyHashable: Any]? = getInfo(data1, data2) //取得に失敗するときはサーバがおちてる if ( ret == nil ){ DispatchQueue.main.async { let alertController = UIAlertController(title: "Error",message: "データとれませんでした.再起動してください", preferredStyle: UIAlertControllerStyle.alert) let okAction = UIAlertAction(title: "アプリを閉じる", style: UIAlertActionStyle.default){ (action: UIAlertAction) in exit(0) } alertController.addAction(okAction) self.window?.rootViewController?.present(alertController,animated: true,completion: nil) } return  }else{ //データがとれたらUserDefaultとかに保存する処理 } } Utility.swift func getInfo(_ data1: String, whithdata2 data2: String) -> [AnyHashable: Any]? { //リクエスト用のパラメータを設定 var url: String = "http://~" let param: String = "data1=" + data1 + "&data2=" + data2 let condition = NSCondition() var parsedData: [AnyHashable : Any]? = nil var encURL: NSURL = NSURL() encURL = NSURL(string:url.addingPercentEncoding(withAllowedCharacters: NSCharacterSet.urlQueryAllowed)!)! var r = URLRequest(url: encURL as URL, cachePolicy: .reloadIgnoringLocalCacheData, timeoutInterval: 20) r.httpMethod = "POST" r.httpBody = param.data(using: String.Encoding.utf8) let task = URLSession.shared.dataTask(with: r) { (data, response, error) in if error == nil { do { if error != nil { condition.unlock() } let httpResponse: HTTPURLResponse? = (response as? HTTPURLResponse) //200が成功 if httpResponse?.statusCode != 200 { condition.unlock() } parsedData = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? [AnyHashable : Any] } catch let error as NSError { condition.unlock() } } condition.signal() condition.unlock() } condition.lock() task.resume() condition.wait() condition.unlock() return parsedData }

###補足情報(言語/FW/ツール等のバージョンなど)
Xcode9.1
Swift3

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Swift

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

Swift 2

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