次世代の非同期処理はこうやって使い分ける!

 次世代の非同期処理はこうやって使い分ける!

Swiftを使っているみなさんなら非同期処理というとGCDやRxSwift、そしてSwift5で実現されるかもしれないasync/awaitを想像するかと思います。
async/awaitが現実に近づいてきた今どの方法で非同期処理を実装するべきか、Rxのstreamが欲しいケース、Promiseが欲しいケース、私の考えるそれぞれの使用シーンを説明します。

0b035ebcffb3af51d4b759733619beb0?s=128

yutaabe200

March 19, 2019
Tweet

Transcript

  1. ࣍ ੈ ୅ ͷ ඇ ಉ ظ ॲ ཧ ͸

    ͜ ͏ ΍ ͬͯ ࢖ ͍ ෼ ͚ Δ ʂ             5 3 :   4 8 * ' 5  1 3 &  5" - , 4       : 6 5"  " # &
  2. 2 ࣗݾ঺հ Ѩ෦༏ଠ !ZVUBBCF $6/&-803,$0 -5%JO/**("5" J04"OESPJE%FWFMPQFSʜͷ͸ͣ 3FBDU&4Yɾ(PMBOH 1)1FS,BJHJͰ-5͠·͢

  3. 3 ໨࣍ "HFOEB 3FBDUJWF&YUFOTJPOT͸Կ͕͍͍ͷ͔ ͳͥ๻Β͸BTZODBXBJUΛཉ͕͠Δͷ͔ 1SPNJTFͳͷ͔4USFBNͳͷ͔

  4. 3FBDUJWF&YUFOTJPOT͸Կ͕͍͍ͷ͔ What is ReactiveExtensions good for …

  5. 5 Կͬ ͯɺͭ·Γʜ

  6. 6 ๻Β͸࣌Λࢧ഑͢Δ͜ͱʹ੒ޭͨ͠ɻ

  7. 7 ΛखʹೖΕͨʁ

  8. 8

  9. 9 ๻Β͸࣌Λࢧ഑͢Δ͜ͱΛ੒ޭͨ͠ɻ

  10. 10 ๻Β͸࣌Λࢧ഑͢Δ͜ͱΛ੒ޭͨ͠ɻ Πϕϯτ΍஋ͷྲྀΕΛ্࣌ؒ࣠Ͱ ετϦʔϜͱͯ͠ѻ͍΍͔ͬͨ͢ɻ

  11. 11 ؂ࢹՄೳ 0CTFSWBCMF ͳ΋ͷΛ࡞Γʜ ΠϕϯτΛߪಡ 4VCTDSJCF ͢Δͱʜ ੒ޭɾࣦഊ PO/FYU PSPO&SSPS

    Λڭ͑ͯ͘Εͨ 0CTFSWBCMF ؍࡯ର৅ 0CTFSWFS ؍࡯͢Δ 4VCTDSJCF
  12. 12 Πϕϯτ΍஋ͷྲྀΕΛ্࣌ؒ࣠Ͱ ετϦʔϜͱͯ͠ѻ͍΍͔ͬͨ͢ɻ ඇಉظॲཧ͕؆୯ʹѻ͍΍͘͢ͳͬͨ

  13. 13 Πϕϯτ΍஋ͷྲྀΕΛ্࣌ؒ࣠Ͱ ετϦʔϜͱͯ͠ѻ͍΍͔ͬͨ͢ɻ ඇಉظॲཧ͕؆୯ʹѻ͍΍͘͢ͳͬͨ

  14. 14

  15. ͳͥ๻Β͸BTZODBXBJUΛཉ͕͠Δͷ͔ Why do we want “async/await”?

  16. 16 Πϕϯτ΍஋ͷྲྀΕΛ্࣌ؒ࣠Ͱ ετϦʔϜͱͯ͠ѻ͍΍͔ͬͨ͢ɻ ඇಉظॲཧ͕؆୯ʹѻ͍΍͘͢ͳͬͨ

  17. 17 Πϕϯτ΍஋ͷྲྀΕΛ্࣌ؒ࣠Ͱ ετϦʔϜͱͯ͠ѻ͍΍͔ͬͨ͢ɻ ඇಉظॲཧ͕؆୯ʹѻ͍΍͘͢ͳͬͨ

  18. 18 func fetchAdminUser(uid: String) { self.loginGateway .fetchAdminUser(uid: uid) .subscribe( onNext:

    { [weak self] adminUserEnitites in // do something }).disposed(by: self.disposeBag) } ͜ΕɺಡΉͷʹͲΕ͘Β͍͔͔Δʁ
  19. 19 func fetchAdminUser(uid: String) async { let entities = await

    self.loginGateway.fetchAdminUser(uid: uid) } ͜͏ͳΒͲ͏ʁ
  20. 20 func fetchAdminUser(uid: String) async { let entities = await

    self.loginGateway.fetchAdminUser(uid: uid) } ͜͏ͳΒͲ͏ʁ
  21. 21 func fetchAdminUser(uid: String) async { let entities = await

    self.loginGateway.fetchAdminUser(uid: uid) } ͜͏ͳΒͲ͏ʁ
  22. 22 3Y͕ඞཁʹͳΔγʔϯ ɾ6*Πϕϯτͷड͚औΓ ɾෳ਺ΠϕϯτͷετϦʔϜ͕ඞཁͳΠϕϯτ ɾσʔλঢ়ଶͷ؂ࢹ %BUB#JOEJOH ɾ୯७ͳ֎෦௨৴ͷSFRVFTUSFTQPOTF ୯ҰඇಉظΠϕϯτ

  23. 23 3Y͕ඞཁʹͳΔγʔϯ ɾ6*Πϕϯτͷड͚औΓ ɾෳ਺ΠϕϯτͷετϦʔϜ͕ඞཁͳΠϕϯτ ɾσʔλঢ়ଶͷ؂ࢹ %BUB#JOEJOH ɾ୯७ͳ֎෦௨৴ͷSFRVFTUSFTQPOTF ୯ҰඇಉظΠϕϯτ

  24. 24 3Y͕ඞཁʹͳΔγʔϯ ɾ6*Πϕϯτͷड͚औΓ ɾ୯७ͳ֎෦௨৴ͷSFRVFTUSFTQPOTF ୯ҰඇಉظΠϕϯτ ɾෳ਺ΠϕϯτͷετϦʔϜ͕ඞཁͳΠϕϯτ ɾσʔλঢ়ଶͷ؂ࢹ %BUB#JOEJOH ͜ΕΛ΋ͬͱ͍ܰͨ͘͠ʂ

  25. 25 3Y͕ඞཁʹͳΔγʔϯ ɾ6*Πϕϯτͷड͚औΓ ɾ୯७ͳ֎෦௨৴ͷSFRVFTUSFTQPOTF ୯ҰඇಉظΠϕϯτ ɾෳ਺ΠϕϯτͷετϦʔϜ͕ඞཁͳΠϕϯτ ɾσʔλঢ়ଶͷ؂ࢹ %BUB#JOEJOH ͜ΕΛ΋ͬͱ͍ܰͨ͘͠ʂ ୯७ͳΠϕϯτʹ·Ͱ3Y͸࢖͍ͨ͘ͳ͍ʂ

  26. 1SPNJTFͳͷ͔4USFBNͳͷ͔ Do you want “Promise” or “Stream”?

  27. 27 1SPNJTFͱ͸ ɾʮ୯ҰͷඇಉظΠϕϯτʯΛѻ͏ ɾBTZODGVODUJPOͷ໭Γ஋ ɾBTZODGVODUJPO͕SFUVSOͨ͠ΒQSPNJTF͕SFTPMWF͢Δ ɾBTZODGVODUJPO͕UISPXͨ͠ΒQSPNJTF͕SFKFDU͢Δ ɾBXBJU͸QSPNJTFͷ݁ՌΛ଴ͪɺฦͬͨΒ࠶։͢Δ Ұൠతͳ

  28. 28 1SPNJTFͰे෼ͳγʔϯ ɾ୯७ͳ"1*ίʔϧ ɾը૾ɾಈըͳͲૢ࡞ͷॏ͍ॲཧ ɾ࣌ݶര஄ ɾෳࡶͳΤϥʔϋϯυϦϯά͕ෆཁ UISPXTOPOUISPXJOHͰ͍͚Ε͹͍͍ ɾฒྻॲཧෆཁ࣌ 'VUVSFͰ͍͚Ε͹͍͍

  29. 29 ɾ୯ҰඇಉظΠϕϯτ͸1SPNJTFͰྑ͔ͬͨ ɾෳ਺ͷඇಉظॲཧ ΠϕϯτετϦʔϜ ͸3Yͷຊ๬

  30. 30 ɾ୯ҰඇಉظΠϕϯτ͸1SPNJTFͰྑ͔ͬͨ ɾෳ਺ͷඇಉظॲཧ ΠϕϯτετϦʔϜ ͸3Yͷຊ๬ ཉ͍͠ͷ͸ʮ1SPNJTFͳͷ͔4USFBNͳͷ͔ʯ

  31. ͝੩ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠