Four flavors of flatMapping in RxSwift
Prerequisite
- Intermediate to advance knowledge of RxSwift
Introduction
Flat map ဆိုတာကတော့ type တစ်ခုကနေ နောက်ထပ် type အသစ်တစ်ခုကို map လုပ်ပေးနိုင်တဲ့ function တစ်ခုဖြစ်ပါတယ်။ RxSwift မှာလည်း observable stream တစ်ခုကနေ new observable stream တစ်ခုကိုပြောင်းချင်တဲ့အခါမျိုးမှာ flatMap ကိုသုံးကြပါတယ်။ RxSwift မှာ flat map လေးမျိုးရှိပါတယ်။
flatMap
ဒါကတော့ အခြေခံအကျဆုံး flat map ဖြစ်ပါတယ်။ ဆိုခဲ့ပြီးသလို source observable တစ်ခု ဒါမှမဟုတ် တစ်ခုထက်ပိုတဲ့ source observable တွေကနေ value တစ်ခု emit လုပ်လိုက်တိုင်း sub-observable အသစ်တစ်ခုကို create လုပ်ပြီး subscribe လုပ်ပေးပါတယ်။ ဥပမာ viewDidAppear event emit ဖြစ်တာနဲ့ network call ခေါ်ပြီး response object stream အဖြစ် flatMap လုပ်ပြီး UI ကိုပြန် drive တာမျိုးဖြစ်ပါတယ်။ Source observable တစ်ခုခုက error event emit လုပ်လိုက်တာနဲ့ flatMapping လုပ်နေတာတွေအားလုံကိုရပ်ပြီး error event ပြန်ပို့ပေးမှာဖြစ်ပါတယ်။
flatMapFirst
FlatMapFirst ဟာ တစ်ကြိမ်မှာ sub-observable တစ်ခုသာ emit လုပ်တာဖြစ်ပြီး current sub-observable ကို emit မလုပ်မချင်း source-observable ကလာတဲ့ event တွေကို ignore လုပ်ပေးထားပါတယ်။ ဥပမာ source observable က တစ်စက္ကန့်ကို value တစ်ခုပို့တယ် flatMap ထဲမှာ sub-observable တစ်ခု emit လုပ်ဖို့ သုံးစက္ကန့်ကြာတယ်ဆိုရင် ပထမတစ်စက္ကန့်မှာ ပို့လိုက်တဲ့ value ကို flatMap က operate လုပ်နေမှာဖြစ်ပြီး နှစ်စက္ကန့် သုံးစက္ကန့် လေးစက္ကန့်က value တွေကိုတော့ ignore လုပ်ထားမှာဖြစ်ပါတယ်။ ငါးစက္ကန့်ကိုရောက်တဲ့အချိန်မှသာ sub-observable emit လုပ်ပြီးသွားတဲ့အတွက် source observable က emit လုပ်လိုက်တဲ့ event ကို handle လုပ်မှာဖြစ်ပါတယ်။
flatMapLatest
Flat map operator တွေထဲမှာ အသုံးအများဆုံး operator ဖြစ်ပါတယ်။ Source observable က နောက်ဆုံး emit လုပ်လိုက်တဲ့ latest event တွေကိုသာ subscribe လုပ်ပြီး on-going subscription တွေကို အလိုအလျှောက် cancel လုပ်ပေးနိုင်ပါတယ်။ FlatMapFirst နဲ့မတူတာကတော့ event တွေကို ignore ထားတာမုတ်ပဲ cancel လိုက်တာဖြစ်တဲ့အတွက် မလိုလားအပ်ပဲ resource တွေကိုအလေအလွင့်မဖြစ်စေပဲ up to date event တွေကိုသာ subscribe လုပ်တာဖြစ်တဲ့အတွက် လူသုံးများနေတယ် ထင်ပါတယ်။ ဥပမာ textField ထဲရိုက်ထည့်လိုက်တဲ့ text အပေါ်မူတည်ပြီး real-time network call ခေါ်မယ်ဆိုပါစို့။ ဒီနေရာမှာ debounce or throttle လုပ်ရမှာဖြစ်ပေမယ့် အဲ့တာတွေခဏမေ့ထားလိုက်ရအောင်။ Textfield ထဲကို hello လို့ရိုက်ထည့်မယ်ဆိုရင် key stroke တစ်ခုချင်းစီအပေါ်မူတည်ပြီး event က ‘h’, ‘he’, ‘hel’, ‘hell’, ‘hello’ ဆိုပြီး ငါးကြိမ်ထွက်သွားပါမယ်။ Network call ကို search query အနေနဲ့ text ထည့်ပေးလိုက်တဲ့အခါ ရှေ့က hello မထွက်ခင် ထွက်ပြီးသား on-going subscription လေးခုကို cancel လုပ်ပြီး နောက်ဆုံး latest ဖြစ်တဲ့ hello နဲ့ network call ခေါ်သွားမှာဖြစ်ပါတယ်။
concatMap
အခြား flat map များနည်းတူ တစ်ကြိမ်ကို sub-observable တစ်ခုသာ emit လုပ်ပါတယ်။ အခြား observable တွေနဲ့မတူတာက source observable က ထွက်လာမယ့် event တိုင်းအတွက် sub-observable တစ်ခု create လုပ်ပေးပါတယ်။ flatMapFirst လိုလည်း ignore မလုပ် flatMapLatest လိုလည်း cancel မလုပ်ဘဲ operate မလုပ်ရသေးတဲ့ event တွေကို buffer လုပ်ထားပြီး တစ်ခုချင်းစီ emit ပြန်လုပ်ပေးနိုင်ပါတယ်။ အခြား flat map တွေနဲ့မတူတဲ့အချက်က ဝင်လာတဲ့ event order အတိုင်း sub-observable တွေပြန်ထွက်လာတဲ့အတွက် order တူတယ်လို့ပြောလို့ရပါတယ်။ ဥပမာ source observable က တစ်စက္ကန့်ကိုတစ်ခါ value emit လုပ်တယ် sub-observable တစ်ခု emit လုပ်ဖို့ သုံစက္ကန့်ကြာတယ်ဆိုပါစို့။ ဒီလိုဆိုရင် source က emit လုပ်လိုက်တဲ့ event တွေအားလုံးကို buffer အနေနဲ့သိမ်းထားပြီး သုံးစက္ကန့်အကြာ sub observable တစ်ခု emit လုပ်ပြီးတော့မှ buffer ထဲကကောင်တွေတစ်ခုချင်းစီကိုဆက်ပြီး map လုပ်ပြီး emit လုပ်သွားမှာဖြစ်ပါတယ်။