同期処理と非同期処理.シリアルおよびパラレル処理付き


同期処理と非同期処理


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種類ある
  • Notification Center
  • Delegate Pattern
  • Closure
  • RxSwift
  • Combine (iOS 14~)
  • まず、3回の露光を用いて非同期でネットワーク通信を行う例を見てみましょう.

    地下鉄の到着情報を検索するアプリがあります.
    ここで、UIsearchBarでドメイン名を検索すると、入力した値が変化すれば、リアルタイム非同期ネットワーク通信でTable Viewの値をリフレッシュすることができる.
  • UI ViewControllerでUI SearchBarの詳細を最初に指定します.
  •         let searchController = UISearchController()
            searchController.searchBar.delegate = self
            navigationItem.searchController = searchController
  • UI SearchBarDelegateプロトコルを使用して、入力値を変更するたびに呼び出されるtextDidChange関数を記述します.
  • extension StationSearchViewController: UISearchBarDelegate {
        func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
            requestStationName(from: searchText)
        }
    }
  • 要求ステータスName:データ要求関数宣言
  •     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がキューをどのように処理するかを決定します.
    シリアルおよび同時処理により、どのキューを使用するかが決定されます.
    これは全く違う概念です.混同しないでください.