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

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

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

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

Swift

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

Q&A

解決済

1回答

286閲覧

プロジェクト種類ごとのPromisesライブラリの動作

yahoo1202

総合スコア2

Xcode

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

Swift

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

0グッド

0クリップ

投稿2022/07/06 09:06

編集2022/07/06 09:10

解決したいこと

Xcodeのプロジェクト種類の違いで、なぜPromisesライブラリの動作が違うのか。

条件

現象

Xcodeで、プロジェクト作成からiOSのAppを選択してプロジェクトを作成した場合、
以下のコードは正しく動作しました。
しかし、プロジェクト作成からmacOSのCommand Line Toolでプロジェクトを作成した場合、
以下のコードは、thenのブロック内に入ることなく終了してしまいます。

import Promises func work1() -> Promise<String> { sleep(2) return Promise("a") } func work2() -> Promise<String> { sleep(2) return Promise("a") } func appmain() { print("main start") work1() .then { _ in work2() } print("main end") }

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

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

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

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

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

guest

回答1

0

ベストアンサー

Command Line Toolでデバッグするとスレッドが1つのまま動いているように見えました。
*iOSでデバッグするとスレッドは2つ3つありました

次の引用に関係しているかもしれません。

Default dispatch queueの指定をしてあげると、動きはまだ微妙かもしれませんが、スレッドが2つになって、work2も呼び出されているように見えました。

Promises use GCD internally and make all APIs provide a way to specify which dispatch queue each block of work should be dispatched on. Main queue is the default, if one isn't specified. Setting the default dispatch queue to any other than the main is normally needed when the main one is busy serving some custom event run loop, but not the standard for Apple platforms CFRunLoop. That situation is pretty common for different server-side frameworks, that similarly to AppKit/UIKit, also implement the inversion of control design principle and park the main thread in a custom run loop. To specify the default dispatch queue, add the following line to the beginning of your program:
(機械翻訳)Promises は内部的に GCD を使用し,すべての API で各ブロックがどのディスパッチキューにディスパッチされるべきかを指定する方法を提供するようにしています.メインキューは、指定されなければデフォルトです。デフォルトのディスパッチキューをメイン以外のキューに設定することは、通常、メインが何らかのカスタムイベント実行ループの提供に忙しいときに必要になりますが、Apple プラットフォームの標準である CFRunLoop ではありません。このような状況は、AppKit/UIKit と同様に、制御の逆転の設計原理を実装し、カスタム実行ループでメインスレッドをパークする、別のサーバーサイドフレームワークではかなり一般的です。デフォルトのディスパッチキューを指定するには、プログラムの最初に次の行を追加します。

swift

1DispatchQueue.promises = .global()

https://github.com/google/promises/blob/master/g3doc/index.md#default-dispatch-queue

投稿2022/07/06 15:04

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

yahoo1202

2022/07/16 07:17

回答ありがとうございます。 返事が遅くなってしまい申し訳ありません。 スレッドが関係しているとの助言ありがとうございます。 こちら調べてみたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問