Today、RxSWIFTを使用したネットワークの例を知っています.


今日はRxSWIFTによるネットワーク通信について解説します.
ネットワーク通信を行うには、次の手順に従います.
1. URL 구성
2. Request 구성 후, 요청
3. 응답에 대한 에러처리
4. 응답에 대한 데이터 가공
5. UI 업데이트
1~5段階を見ると、1つのシーケンスと考えられますよね?したがって、Observableで定義することができる.そして必要な時点で対応するOverBubbleを購読すればいいです私はこれがMVCモードだと仮定して、私がすぐに購読してUITableViewに更新すると仮定して、私はコードを書きます.
1.URLの設定
まずObservableを作成します.
Observable.just(urlString)
  • ジェネレータデザイナを使用して、希望するように作成できます.URL Stringを1つだけ渡すためにjustを使いました.
  • 現在のデータ型はObservable<String> です.
    Observable<String> -> URL
    次のようにタイプを変更します.ではmapでよろしいでしょうか
    Observable.just(urlString)
    	map. { urlString -> URL in 
          return URL(string: urlString)!
      }
  • String->URLに変換されました.
  • 2.要求完了後、要求
    URLを作成すると、「URLリクエスト」に置き換えることで、リクエスト可能な形式に変更できます.以前のようにmapを使います.
    .map { url -> URLRequest in 
    	var request = URLRequest(url: url)
     	request.httpMethod = "GET"
      return request
    }
    実際のリクエストの後、Observerableを再作成します.今回はrxでサポートされているURLセッションを使用します.今回はFlatMapで
    FlatMapのプロパティ

  • ストリームから放出されたコンテンツを別のファイババブルにする.

  • 「最初の傍観者バブルからのI.TAM->FlatMap傍観者バブルI.TAM」はこのように行われます最初の傍観者から3つのof演算子が送られた場合,flatMapで生成された傍観者が4つのofを持つと仮定すると,
  • 一番早い:Observable.の(1,2,3)->3個
  • FlatMap傍観者バブル:観測不可.の(「a」,「b」,「c」,「d」)->4個
  • 仮にそうだとしたら、
  • は、初期ファイバフォーム1->FlatMapファイバフォームa,b,c,dに放出する
  • である.
  • は、初期ファイバフォーム2->FlatMapファイバフォームa,b,c,dに放出する
  • である.
  • は、初期ファイバフォーム3->FlatMapファイバフォームa,b,c,dに放出する
  • である.
  • は、初期ファイバフォーム4->FlatMapファイバフォームa,b,c,dに放出する
  • である.
    購読すると、このようにイベントが公開されます.
    したがって、最初の傍観者Bubbleが1つのアクティビティだけを渡すと、FlatMap傍観者Bubbleは自分が解放するアクティビティを乗算します.
    gugugudanが2段だけ入力して1~9を生成したように
    しかし、私たちの例では、justで1つだけ伝達することを定義しているので、このようなことは起こりません.
    トピックに戻り、rxでサポートされているURLセッションを使用してFlatMapでファイバチャネルを再作成します.
    .flatMap { request -> Observable<(response: HTTPResponse, data: Data)> in 
    	return URLSession.shared.rx.response(request: request)
    }
    3.応答エラー処理
    受信した200〜299個の応答のみをフィルタリングし,通常の通信時のデータのみをフィルタリングした.
    .filter { (response, data in 
    	return 200..<300 ~= response.statusCode          
    }
  • データパラメータは使用されません.ワイルドカードモードを使用できます.
  • 4.応答のデータ加工
    エラーをフィルタしました.受信したデータをシリアル化します.
    .map { (response, data) -> [[String: Any]] in 
    	guard let json = try? JSONSerialization.jsonObject(with: data, options: []),
          	let result = json as? [[String: Any]] else { return [] }
      return result
    }
  • 今回のコードも応答を使用しないので、ワイルドカードモード処理を行ってみてはいかがでしょうか.
  • mapオペレータは、
  • jsonを用いてシリアル化した後、タイプ選択に成功した結果を返すことができる.
  • データが作成されました.しかし、受け取ったデータもゼロになる可能性があります.つまり、Getリクエストはデータを受信していない可能性があります.私はこれに対して処理します.
    .filter { filteredResponse in 
    	return filteredResponse.count > 0
    }
  • 現在のfilteredResponseのタイプは[String:Any]です.
  • フィルタ演算子
  • は、データの値が0より大きい場合にのみ使用できます.
  • UIの更新により、データを必要なデータモデルに変換できます.ここでは、任意に設定したモデルを使用してコードを記述します.
  • (UserInfoがランダムに作成したDecodable Struct.)
    .map { finalResponse in 
    	return finalResponse.compactMap { dic -> UserInfo in
    		guard let userID = dic["userId"] as? Int
    					let	userName = dic["username"] as? String				
    					let userEmail = dic["email"] as? String
    					let userPhone = dic["phoneNum"] as? String
    		else { return nil }
    		
    		return UserInfo(userID, userName, userEmail, userPhone)
    	}         
    }
  • パラメータは[String:Any]である.これらの値を定数として宣言し、最終的にデータをstructに構造化します.
  • 5.UIの更新
    今購読して傍観者Bubbleを実行すればいいですよね?
    .subscribe(onNext: { [unown self] response in 
    	self.tableViewDataModel.onNext(response)
    	
    	DispatchQueue.main.async {
        self.tableView.reloadData()
      }
    })
  • を購読すると、tableViewDataModelという名前があります.これは私が勝手につけた名前です.
  • です.
    private let tableViewDataModel = BehaviorSubject<[UserInfo]>(value: [])
    こうして宣言した見るとBehaviorSubjectイベントがファイバまたはサブアイテムに送信される場合は、初期値とともにサブスクライバに送信されるサブアイテムです.これは、tableviewで使用するために、ネットワーク通信の結果をサブオブジェクトに渡すための足場石です.もちろん、RxDataSourceを使用して実装する場合は、ネットワークに集中するために異なる方法で実装します.
    整理する
  • の広い範囲から見ると、タイプはこのように変化している.Observable< String > -> Observable< HTTPResponse, Data > -> UserInfo
  • URLSSession+Rxを使用して
  • ネットワークに接続します.
  • が最終的に完了したデータ.
  • 読んでくれてありがとう^^