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

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

新規登録して質問してみよう
ただいま回答率
86.12%
並列処理

複数の計算が同時に実行される手法

バックグラウンド処理

バックグラウンド処理とは、マルチタスク環境において、ユーザーに対して前面に表示させている処理の裏側で実行させる処理のことを呼びます。バックグラウンド処理を行う事によって、ユーザーが他の作業に携わることが可能となります。

非同期処理

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

Swift

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

受付中

swift 非同期処理 メインスレッド、サブスレッドについての挙動

YutaMatsuura715
YutaMatsuura715

総合スコア2

並列処理

複数の計算が同時に実行される手法

バックグラウンド処理

バックグラウンド処理とは、マルチタスク環境において、ユーザーに対して前面に表示させている処理の裏側で実行させる処理のことを呼びます。バックグラウンド処理を行う事によって、ユーザーが他の作業に携わることが可能となります。

非同期処理

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

Swift

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

2回答

0リアクション

3クリップ

3788閲覧

投稿2021/06/15 02:52

swiftで非同期処理、マルチスレッドを学習しているのですが、概念というかいまいち仕組みについてピンときません。
私の考えがずれている可能性があるので間違っている箇所があればご指摘いただきたいです。

swiftで
①DispatchQueue.mian.async
②DispatchQueue.mian.sync
③DispatchQueue.global.async
④DispatchQueue.global.sync

①② と ③④の違いはメインスレッドで行うか、サブスレッドで行うかの違い。

① と ② の違いは並列で行うか直列で行うか

③ と ④ の違いも並列で行うか。直列で行うか。

とある本では通信に関する処理は自動でサブスレッドで非同期処理(並列)で行われると書いてありました。
UIに関する処理はメインスレッドで。

つまり、API通信や、Firebaseなどから情報を取得する際はサブスレッドで並列処理が自動で行われているということになります。

swift

import UIKit class ViewController:UIViewController{ var label:UITextView! override func viewDidLoad(){ super.viewDidLoad() label=UITextView() label.text="ロード中" label.frame=CGRect(x:10,y:30,width:self.view.frame.width - 20,height:300) self.view.addSubview(label) let unit = "metric" let appId = "ebaf2eeae4e09f63ccdcb4e59e5fac68" let city = "Tokyo" let urlString="https://api.openweathermap.org/data/2.5/weather?units=(unit)&APPID=(appId)&q=(city)" let url=URL(string:urlString)! var request=URLRequest(url:url) request.httpMethod="GET" let task = URLSession.shared.dataTask(with:request){(data,response,error) in guard let data = data else{ return } do { let object = try JSONSerialization.jsonObject(with:data,options:[]) as? [String:Any] print(object)           //①メインスレッドで非同期処理? DispatchQueue.main.async{ self.label.text = object?.description self.label.sizeToFit() } } catch let e{ print(e) } } task.resume() } override func didReceiveMemoryWarning(){ super.didReceiveMemoryWarning() } }

ある本のソースコードです。天気のwebAPIへリクエストを送り、そのレスポンス(json)を表示するプログラムです。
データの取得時に①の処理がありますが、このロジックはどのように動いているのかが理解できません。
通信に関するものはサブスレッドで行われるらしいですが具体的にどこからどこまでがサブスレッドで行われているのか。
なぜ、メインスレッドに処理を渡すことでこのソースコードは応答性の向上が見込めるのか。
結局レスポンスが返ってきた瞬間にメインスレッドの並列の処理に即処理を渡すコードを書くことですぐに反映されるからってことでいいんですかね。メインスレッドは直列で他の処理を行ったりするから並列でUIの更新をする的な?

例えば、逆に

swift

DispatchQueue.main.async{ self.label.text = object?.description self.label.sizeToFit() }

の処理を外に放り出すとどのようなロジックで応答性に差が出るのでしょうか

以下のような質問にはリアクションをつけましょう

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

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

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

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

アカウントをお持ちの方は

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

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

並列処理

複数の計算が同時に実行される手法

バックグラウンド処理

バックグラウンド処理とは、マルチタスク環境において、ユーザーに対して前面に表示させている処理の裏側で実行させる処理のことを呼びます。バックグラウンド処理を行う事によって、ユーザーが他の作業に携わることが可能となります。

非同期処理

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

Swift

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