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

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

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

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

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

Q&A

解決済

1回答

1923閲覧

Swift で元いたスレッドに戻れるようにしたい

sont

総合スコア35

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

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

0グッド

0クリップ

投稿2019/04/07 09:33

現在、以下のような関係にある、myFunc1() と myFunc2() があります。

swift

1func myFunc1() { 2 let dispatchQueueA = DispatchQueue(label: "QueueA") 3 4 print("1. Current Thread: (Thread.current)") 5 dispatchQueueA.async { 6 print("2. Current Thread: (Thread.current)") 7 8 myFunc2(completion: { 9 print("3. Current Thread: (Thread.current)") 10 print("Completed!!!") 11 }) 12 } 13} 14 15func myFunc2(completion: @escaping () -> Void) { 16 let dispatchQueueB = DispatchQueue(label: "QueueB") 17 18 dispatchQueueB.async { 19 print("4. Current Thread: (Thread.current)") 20 21 // この処理は元のThread(myFunc2()が呼ばれたThread)に戻して処理したい 22 completion() 23 } 24}

myFunc1()をMainThreadから呼び出したところ、

  1. Current Thread: <NSThread: 0x600002db5440>{number = 1, name = main}
  2. Current Thread: <NSThread: 0x600002dade40>{number = 3, name = (null)}
  3. Current Thread: <NSThread: 0x600002daddc0>{number = 4, name = (null)}
  4. Current Thread: <NSThread: 0x600002daddc0>{number = 4, name = (null)}

Completed!!!

このようなログを得ました。
上記コメントにも書いた通り、myFunc2は呼び出された後に、自分で独自のThreadを作成し、その中で処理をした後、completion()というクロージャを呼び出しています。
このcompletion()を呼び出す際には、元のThread、つまり、myFunc2を呼び出したThreadに戻してから処理をしたいのですが、どのようにすれば良いでしょうか?
MainThreadから必ずmyFunc2が呼び出されるのであれば、

swift

1DispatchQueue.main.async

を使ってやればいいのですが、myFunc2がどのスレッドから呼び出されるかは必ずしも固定はされていません。
どのようにしてやれば、myFunc2の呼び出し元のスレッドに戻すことができるでしょうか?

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

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

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

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

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

guest

回答1

0

ベストアンサー

swift

1self.dispatchQueueA.async { 2 completion() 3}

これでいいんじゃ?(dispatchQueueAはインスタンス変数にする必要あり)


completion()を呼び出す際

とは微妙に違うけど、completionの中身をdispatchQueueAで実行するってことなら、

swift

1self.myFunc2(completion: { 2 dispatchQueueA.async { 3 print("3. Current Thread: (Thread.current)") 4 print("Completed!!!") 5 } 6})

これで良いかと。


なんで悩んでいるのかよく分からないので勘違いしてるかも‥。

投稿2019/04/08 01:13

fuzzball

総合スコア16731

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

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

sont

2019/04/11 04:16

遅れて申し訳ありません。 myFunc2() の中では、どのスレッドから呼び出されているかに依存せずに実行できるようにしたいという意味でした。 ですから、myFunc2() の中で、決め打ちでdispatchQueueAを呼び出すようにしてしまうと、仮に他のスレッドからmyFunc2()を呼び出した場合も、completionが、dispatchQueueAのスレッドで呼ばれてしまうので、そこは避けたいです。
fuzzball

2019/04/11 07:05 編集

下の回答じゃダメなんでしょうか? myFunc2()の中で決め打ちしているわけではないので大丈夫なのでは。 そうやってイチイチ書くのが面倒とか、そういう話でしょうか?
sont

2019/04/15 05:36

コメントありがとうございます。 よく考えたらそうですね。。。 下の回答で問題ありませんでした!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問