swiftで非同期処理、マルチスレッドを学習しているのですが、概念というかいまいち仕組みについてピンときません。
私の考えがずれている可能性があるので間違っている箇所があればご指摘いただきたいです。
swiftで
①DispatchQueue.mian.async
②DispatchQueue.mian.sync
③DispatchQueue.global.async
④DispatchQueue.global.sync
①② と ③④の違いはメインスレッドで行うか、サブスレッドで行うかの違い。
① と ② の違いは並列で行うか直列で行うか
③ と ④ の違いも並列で行うか。直列で行うか。
とある本では通信に関する処理は自動でサブスレッドで非同期処理(並列)で行われると書いてありました。
UIに関する処理はメインスレッドで。
つまり、API通信や、Firebaseなどから情報を取得する際はサブスレッドで並列処理が自動で行われているということになります。
swift
1import UIKit 2class ViewController:UIViewController{ 3 var label:UITextView! 4 5 override func viewDidLoad(){ 6 super.viewDidLoad() 7 label=UITextView() 8 label.text="ロード中" 9 label.frame=CGRect(x:10,y:30,width:self.view.frame.width - 20,height:300) 10 self.view.addSubview(label) 11 12 let unit = "metric" 13 let appId = "ebaf2eeae4e09f63ccdcb4e59e5fac68" 14 let city = "Tokyo" 15 let urlString="https://api.openweathermap.org/data/2.5/weather?units=(unit)&APPID=(appId)&q=(city)" 16 let url=URL(string:urlString)! 17 var request=URLRequest(url:url) 18 request.httpMethod="GET" 19 20 let task = URLSession.shared.dataTask(with:request){(data,response,error) in 21 guard let data = data else{ return } 22 do { 23 let object = try JSONSerialization.jsonObject(with:data,options:[]) as? [String:Any] 24 print(object) 25 //①メインスレッドで非同期処理? 26 DispatchQueue.main.async{ 27 self.label.text = object?.description 28 self.label.sizeToFit() 29 } 30 } catch let e{ 31 print(e) 32 } 33 } 34 task.resume() 35 } 36 override func didReceiveMemoryWarning(){ 37 super.didReceiveMemoryWarning() 38 } 39}
ある本のソースコードです。天気のwebAPIへリクエストを送り、そのレスポンス(json)を表示するプログラムです。
データの取得時に①の処理がありますが、このロジックはどのように動いているのかが理解できません。
通信に関するものはサブスレッドで行われるらしいですが具体的にどこからどこまでがサブスレッドで行われているのか。
なぜ、メインスレッドに処理を渡すことでこのソースコードは応答性の向上が見込めるのか。
結局レスポンスが返ってきた瞬間にメインスレッドの並列の処理に即処理を渡すコードを書くことですぐに反映されるからってことでいいんですかね。メインスレッドは直列で他の処理を行ったりするから並列でUIの更新をする的な?
例えば、逆に
swift
1DispatchQueue.main.async{ 2 self.label.text = object?.description 3 self.label.sizeToFit() 4 }
の処理を外に放り出すとどのようなロジックで応答性に差が出るのでしょうか
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/06/16 22:22 編集