به نام خدا
خب بنده میلاد حیدری هستم حدود ۳ ساله شایدم بیشتر شایدم کمتر برنامه نویسی اندروید میکنم.
چقد فونت ویرگول خوبه، خب میخوام یک مقدار از تجربیات خودم و استفاده ای که از rx کردم باهاتون به اشتراک بزارم ... البته در نظر دارم بعضی جاهارو ترجمه کنم از داکیومنت rx.

خو اول یه مقدار از خود rx بگم که اونایی ک آشنایی ندارن یه ذهنیت اولیه پیدا کنن. مثلا فرض کنید شما یه ظرف غذا جلوتونه خیلی کارا میتونید باهاش بکنید مثلا میتونید بخوریدش میتونید بدید یکی دیگه بخوره میتونید سس بزنید بخوریدش یا مثلا حتی میتونید بخوریدش و بعدش دوباره یه غذای دیگه هم روش بخورید کلا فلسفه rx اینه که ما یه داده ای داریم میخوایم روش یه حرکتی بزنیم، هر حرکتی میتونیم بزنیم امیدوارم توضیحاتم کافی بوده باشه البته یه سایتی هست که اینها لینکش اینجا یه سری آموزشای ابتدایی خوبی داره البته سرچم کنید نتایج خوبی میرسید.
بریم سراغ اون عملیاتایی که میتونیم رو داده هامون بزنیم.
۱- مپ و فلت مپ (map - flat map) : من خودم خیلی ازینا استفاده کردم اول فرقشو میگم مپ به این صورته که یک جریان داده میگیره و داده های داخل اون جریان به یه چیز دیگه مپ میکنه ولی فلت مپ یک جریان داده میگیره و داده های داخل اون جریانو به یک جریان دیگه مپ میکنه یعنی یه خروجیش یه جریان دیگس. مثلا وقتی شما میخواید از دیتابیس یه چیزی بگیرید و بعدش برید از api یه چیز دیگه کال کنید باید از فلت مپ استفاده کنید. مثلا کد زیر :
rahavard365SocialService.getPostsList(contentId).flatMap {posts-> getSummaries(posts.data[0].id) }.subscribe() private fun getSummaries(id:String): Observable<SummaryList> { . . . return Observable.fromArray(SummaryList()) }
در کد بالا ابتدا ما رفتیم getPostsList صدا زدیم ک خروجیش یه سری پست میباشد بعدش اومدیم فلت مپ زدیم یعنی میخوایم خروجیشو تبدیل به یه چیز دیگه کنیم ، اومدیم آیدی اولین پست دادیم به متد getSummaries که خروجی این متد هم یک Observable یعنی یک جریان داده دیگه.
۲- زیپ (zip) : این خیلی مورد کاربردی وقتی میخوایم یه سری فرآیند ها همزمان انجام بشه و نتیجشون باهم یه جا قابل دسترس باشه. قبلا اینطور بود که باید ما فلگ ست میکردیم ببینیم مثلا اسم کاربرا از api اومده و پستاشون ازون یکی api اومده حالا اگه جفتشون اومده بود بیایم مثلا لیست ویو پر کنیم اگه نیومده بود باید صبر کنیم، اینجور کد زدن هم پیچیدس هم خیلی کر کثیف ولی با این خدمت بزرگ rx ما دیگه این مشکلات حل کردیم به کد پایین دقت نمایید:
rahavard365TradingService.getBankAccounts(brokerAccount.id, "bank") .zipWith( {rahavard365TradingService.getBalances(brokerAccount.id)}, { t: BankAccounts, t2: Balances -> Pair(t, t2) } ).subscribeOn(schedulerProvider.computationThread()).observeOn(schedulerProvider.mainThread()).subscribe()
خو ما تو خط اول اومدیم گفتیم برو bankAccounts هارو از api بگیر و در خط ۳م گفتیم همزمان برو getBalances بگیر و در خط ۴ اومدیم گفتیم نتایج این ۲ درخواستی ک ما به api دادیم به صورت یک آبجکت Pair برگردون خطای بعدیشم گفتیم که رو چ تردی انجام بشه این کارای که ما گفتیم.
دیگه خسته شدم بقیشو بعدا میگم براتون