同期処理と非同期処理.シリアルおよびパラレル処理付き
同期処理と非同期処理
Alamofireを用いてJSONタイプの情報を非同期で要求し,これらの情報を学習した.
非同期処理に関する学習記事を更新し続けます.
不足や間違いがある場合は、指摘してください.
同期処理と非同期処理の違い
同期処理とは?
タスクをシリアルで実行するプロセスと理解できます.
1行のプロセス・シーケンスがある場合は、順番に処理します.
たとえば
UI->ネットワーク通信の変更->その他の作業
このように行います.
コンセプト
マスタスレッドでTask 1をThread 2に渡す.
主Thread上のTask 1が占める領域は「ブロック」である.
Thread 2「待機」処理Task 1
非同期処理とは?
タスクを並列に実行するプロセスとして理解されます.
複数のタスクを同時に並列に処理します.
UI+ネットワーク通信+その他の作業の変更
もっと簡単な例を挙げると、掃除機を回しながら電話をかけたり、インスタントラーメンの水を上げたりしながら、同時に行えばいいのです.
コンセプト
Thread 1に複数のTaskがあるとします.
サーバ通信などのネットワーク分散処理を使用する必要がある場合、プライマリスレッドはTask 1(タスク1)をThread 2で開始する.
このとき、MainThread「Task 1の終了を待たない」
これにより、Main Threadは他のことを処理することができます.
非同期処理
だいたい5種類ある
同期処理とは?
タスクをシリアルで実行するプロセスと理解できます.
1行のプロセス・シーケンスがある場合は、順番に処理します.
たとえば
UI->ネットワーク通信の変更->その他の作業
このように行います.
コンセプト
マスタスレッドでTask 1をThread 2に渡す.
主Thread上のTask 1が占める領域は「ブロック」である.
Thread 2「待機」処理Task 1
非同期処理とは?
タスクを並列に実行するプロセスとして理解されます.
複数のタスクを同時に並列に処理します.
UI+ネットワーク通信+その他の作業の変更
もっと簡単な例を挙げると、掃除機を回しながら電話をかけたり、インスタントラーメンの水を上げたりしながら、同時に行えばいいのです.
コンセプト
Thread 1に複数のTaskがあるとします.
サーバ通信などのネットワーク分散処理を使用する必要がある場合、プライマリスレッドはTask 1(タスク1)をThread 2で開始する.
このとき、MainThread「Task 1の終了を待たない」
これにより、Main Threadは他のことを処理することができます.
非同期処理
だいたい5種類ある
地下鉄の到着情報を検索するアプリがあります.
ここで、UIsearchBarでドメイン名を検索すると、入力した値が変化すれば、リアルタイム非同期ネットワーク通信でTable Viewの値をリフレッシュすることができる.
let searchController = UISearchController()
searchController.searchBar.delegate = self
navigationItem.searchController = searchController
extension StationSearchViewController: UISearchBarDelegate {
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
requestStationName(from: searchText)
}
}
private func requestStationName(from stationName: String) {
let urlString = "http://openapi.seoul.go.kr:8088/sample/json/SearchInfoBySubwayNameService/1/5/\(stationName)"
//'서울'이라는 한글 키워드가 url에 들어있으므로 변환 시 특수문자로 변경되는 현상
//addingPercentEncoding 사용
AF.request(urlString.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) ?? "")
.responseDecodable(of: StationResponseModel.self) { response in
guard case .success(let data) = response.result else { return }
print(data.stations)
}
.resume()
}
ここで「閉じる」を使用する非同期処理のセクションは、次のとおりです. { response in
guard case .success(let data) = response.result else { return }
print(data.stations) //Check data response
}
responseパラメータのreturn値を表示します.成功すると、エラーは2つを返します.
ここではエラー処理はなく、応答のみ確認します.
成功
通常、リクエストとサーバから応答を受信した賞は、ステータスの結果値をデータに格納します.
データを定義する「状態応答モデル」(StationResponseModel)との整合性を確認します.
値を変更するたびに印刷されます.
シリアルとパラレル処理を見てみましょう。
シリアル処理
線の概要:「別のThread」は、分散したタスク(通常はプライマリドメイン)を処理します.
例えば、Main Threadでは、複数のTaskがThread 2にのみ渡され、Taskが生成される場合をシリアル処理と呼ぶ.
同時処理
線の概要:「複数の異なるThread」は、分散したタスク(通常はプライマリドメイン)を処理します.
たとえば、各セルの画像をサーバから読み込む必要があります.
シリアル処理のようにTaskを一つのThreadに集中すると,つまずきが発生する.
これらのタスクはそれぞれ独立しているが、サーバから画像を読み出す複数の類似したタスクを処理するため、同時処理を使用して複数のThreadにタスクを分散する.
並列処理は複数のThreadに作業を分散すればよいのに、なぜシリアル処理するのか。
簡単に考える.
同時処理の場合,順序はあまり関係ない.
逆に、タスクに順序が必要な場合は、シリアル処理が使用されます.
では、非同期と同期処理は同じ意味ですか?
いいえ.
同期と非同期は、送信タスク(通常はMain)Threadがキューをどのように処理するかを決定します.
シリアルおよび同時処理により、どのキューを使用するかが決定されます.
これは全く違う概念です.混同しないでください.
Reference
この問題について(同期処理と非同期処理.シリアルおよびパラレル処理付き), 我々は、より多くの情報をここで見つけました
https://velog.io/@iseeu95/동기처리와-비동기처리
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
Reference
この問題について(同期処理と非同期処理.シリアルおよびパラレル処理付き), 我々は、より多くの情報をここで見つけました https://velog.io/@iseeu95/동기처리와-비동기처리テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol