Avatar
ご回答ありがとうございます!取り急ぎ下記に、記載いただいた内容を試した結果を記載します。 >echo "start" && sleep 3 && echo "end" だったらうまくいきますか? はい、うまく動作します。 start end >0.5秒のsleepを終了待ちではなく whileループの中に入れたらどうなりますか?
  • 下記の通り変更しました。
  • 動作としては変化なしで、xcodebuildの処理が終了しない状態です。
// Processが完了するまで、Taskがキャンセルされていないかを監視 while process.isRunning { // xcodebuildを呼び出した際にここがfalseにならない do { try Task.checkCancellation() } catch { process.terminate() completion(.failure(.cancel)) return } Thread.sleep(forTimeInterval: 0.5) } let data = pipe.fileHandleForReading.readDataToEndOfFile() // Thread.sleep(forTimeInterval: 0.5) // Taskの終了を待つためのDelay(必要?) >async版executeの withCheckedThrowingContinuation の冒頭で、同期版 execute の実行を専用に用意したDispatchQueueに退避したらどうなりますか?
  • 下記の通り変更しました。
  • 動作としては変化なしで、xcodebuildの処理が終了しない状態となります。
/// async版 @discardableResult static func execute(command: String, currentDirectoryURL: URL? = nil) async throws -> String { try await withCheckedThrowingContinuation { continuation in DispatchQueue.global(qos: .background).async { execute(command: command, currentDirectoryURL: currentDirectoryURL) { result in do { let output = try result.get() continuation.resume(returning: output) } catch { continuation.resume(throwing: error) } } } } }
8:07 AM
>4(おまけ) Process.waitUntilExit という便利なメソッドがありますよ。
  • 下記のコードで試しましたが、waitUntilExitの部分でxcodebuildの処理が終了しない状態となりました。
do { try process.run() } catch { completion(.failure(.failedInRunning)) return } process.waitUntilExit() // xcodebuildを呼び出した際にここで止まってしまう let data = pipe.fileHandleForReading.readDataToEndOfFile()