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

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

新規登録して質問してみよう
ただいま回答率
87.20%
非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

Swift

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

解決済

SwiftのConcurrency利用時の待機について

thirdesr34
thirdesr34

総合スコア36

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

Swift

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

1回答

1評価

1クリップ

178閲覧

投稿2022/08/01 06:42

前提

SwiftとUIKitを利用してiOSアプリを作成しています。
利用しているライブラリの関数でasyncキーワードの付いているものがあり、その結果をどのように受け取るか不明なので知りたいと思っています。
色々とConcurrencyについて調べたのですがうまく解決できないため、質問させてください。

実現したいこと

UIApplicationDelegateのファイルを開いた際のデリゲートメソッドapplication(_:open:options:)では、ファイルを正常に開けた場合はTrueを返すことになっています。
このメソッドの内部で、ライブラリの関数を用いて結果を得て、その結果をもとに戻り値を返したいと思っています。

発生している問題

ライブラリの関数側では、関数の定義にasyncキーワードが付いているため、呼び出し側ではawaitを付けて呼ぶか、Task節で囲う必要があると理解しています。ただ、これらの方法はどちらも難があります。

Swift

//ライブラリ側関数の定義 func getValue(_ url: URL) async -> Int

1.単にawaitを付けて呼ぶライブラリの関数を呼び出す場合
メソッド内部でawaitを利用すると、そのメソッド自体にasyncをつける必要が発生しますが、UIKit側に定義されているapplication(_:open:options:)と異なってしまうため、呼び出し元のメソッド自体にasyncをつけることはできません。

Swift

func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool { let result = await library.getValue(url) if (result == 1) { return true } return false }

2.Task節で囲ってライブラリの関数を呼び出す場合
awaitを付けて呼び出すよう記述しても、Task節自体はapplication(_:open:options:)メソッドの実行時ではなく非同期的に実行されると思われるため、下記のコードでは常にfalseを返してしまいます。

Swift

func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool { Task{ let result = await library.getValue(url) if (result == 1) { return true } } return false }

おそらくTask節の終わりの方が筋が良いと思いますが、ライブラリ関数の実行が完了するまで待機しておき、ライブラリ関数の戻り値を得てからメソッドの戻り値を返すようにするには、どのように記述すればよいでしょうか。
または、Task以外により良い記述の仕方があれば教えてください。

補足情報(FW/ツールのバージョンなど)

Xcode 13.4.1
Swift 5.6.1

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

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

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

Swift

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