前提
SwiftとUIKitを利用してiOSアプリを作成しています。
利用しているライブラリの関数でasyncキーワードの付いているものがあり、その結果をどのように受け取るか不明なので知りたいと思っています。
色々とConcurrencyについて調べたのですがうまく解決できないため、質問させてください。
実現したいこと
UIApplicationDelegateのファイルを開いた際のデリゲートメソッドapplication(_:open:options:)では、ファイルを正常に開けた場合はTrueを返すことになっています。
このメソッドの内部で、ライブラリの関数を用いて結果を得て、その結果をもとに戻り値を返したいと思っています。
発生している問題
ライブラリの関数側では、関数の定義にasyncキーワードが付いているため、呼び出し側ではawaitを付けて呼ぶか、Task節で囲う必要があると理解しています。ただ、これらの方法はどちらも難があります。
Swift
1//ライブラリ側関数の定義 2func getValue(_ url: URL) async -> Int
1.単にawaitを付けて呼ぶライブラリの関数を呼び出す場合
メソッド内部でawaitを利用すると、そのメソッド自体にasyncをつける必要が発生しますが、UIKit側に定義されているapplication(_:open:options:)と異なってしまうため、呼び出し元のメソッド自体にasyncをつけることはできません。
Swift
1 func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool { 2 let result = await library.getValue(url) 3 if (result == 1) { 4 return true 5 } 6 return false 7 }
2.Task節で囲ってライブラリの関数を呼び出す場合
awaitを付けて呼び出すよう記述しても、Task節自体はapplication(_:open:options:)メソッドの実行時ではなく非同期的に実行されると思われるため、下記のコードでは常にfalseを返してしまいます。
Swift
1 func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool { 2 Task{ 3 let result = await library.getValue(url) 4 if (result == 1) { 5 return true 6 } 7 } 8 return false 9 }
おそらくTask節の終わりの方が筋が良いと思いますが、ライブラリ関数の実行が完了するまで待機しておき、ライブラリ関数の戻り値を得てからメソッドの戻り値を返すようにするには、どのように記述すればよいでしょうか。
または、Task以外により良い記述の仕方があれば教えてください。
補足情報(FW/ツールのバージョンなど)
Xcode 13.4.1
Swift 5.6.1
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/08/03 13:23