Slide 1

Slide 1 text

SwiftͷੜΈͷ਌ʹΑΔ async/await for SwiftΛపఈղઆ͠ ৽͍͠ඇಉظॲཧͷख๏Λཧղ͢Δ iOSDC Japan 2018 Track B 17:40- ϨΪϡϥʔτʔΫ(30෼) גࣜձࣾΩϡϦΦγςΟιϑτ΢ΣΞࠓ৓ળۣ !ZJNBKP

Slide 2

Slide 2 text

ෳ਺͋Δηογϣϯͷத͔ΒબΜͰ௖͖ ͋Γ͕ͱ͏͍͟͝·͢ ϋογϡλάJPTEDC

Slide 3

Slide 3 text

ࣗݾ঺հ

Slide 4

Slide 4 text

ʮSwift 5 async/await ݚڀಡຊʯ IUUQTCPPUIQNKBJUFNT • ٕज़ܥಉਓࢽ(epub, pdf) • async/awaitͱ͸Կ͔ • HydraͰཧղ͢Δasync/await • Hydraͷasync/await࣮૷ΛಡΉ • ϓϩϙʔβϧͷղઆ • ͞·͟·ͳݴޠͰͷasync/awaitͱͦͷྺ࢙

Slide 5

Slide 5 text

ࠓ೔࿩͢͜ͱ • async/awaitͬͯͦ΋ͦ΋ԿΑʁ

Slide 6

Slide 6 text

ࠓ೔࿩͢͜ͱ • async/awaitͬͯͦ΋ͦ΋ԿΑʁ • ϓϩϙʔβϧυϥϑτͷ async/awaitʹ͍ͭͯͷղઆ

Slide 7

Slide 7 text

ࠓ೔࿩͢͜ͱ • async/awaitͬͯͦ΋ͦ΋ԿΑʁ • ϓϩϙʔβϧυϥϑτͷ async/awaitʹ͍ͭͯͷղઆ • async/awaitΛ࣮ݱ͢Δίϧʔνϯͱ͸Կ͔

Slide 8

Slide 8 text

ࠓ೔࿩͢͜ͱ • async/awaitͬͯͦ΋ͦ΋ԿΑʁ • ϓϩϙʔβϧυϥϑτͷ async/awaitʹ͍ͭͯͷղઆ • async/awaitΛ࣮ݱ͢Δίϧʔνϯͱ͸Կ͔ • ࠓ͔ΒͰ΋ϥΠϒϥϦͰ࢖͑Δasync/await

Slide 9

Slide 9 text

async/await Λެࣜʹ࠾༻͍ͯ͠Δݴޠ • C# • Dart • Kotlin • JavaScript ES2017(ES6) • Scala • python • ….etc

Slide 10

Slide 10 text

ඇಉظॲཧʹؔ͢Δ async/await دΓͷྺ࢙ ೥ϝϧϰΟϯɾίϯ΢ΣΠࢯͷ࿦จʹΑΔίϧʔνϯ͕ൃද ೥ΧʔϧɾώϡʔΠοτࢯɺϔϯϦʔɾϕΠΧʔࢯͷ࿦จʹΑΔ'VUVSF͕ൃද ೥$/&5'SBNFXPSLίϧʔνϯαϙʔτʢओʹZJFMEʣ ೥$Y/&5'SBNFXPSL3FBDUJWF&YUFOTJPOT 3Y ͕ಋೖ ೥$/&5'SBNFXPSLBTZODBXBJU 5BTLϕʔε ೥%BSUBTZODBXBJUʢ'VUVSFϕʔεʣ͕ಋೖ ೥+BWB4DSJQU&4 &4 BTZODBXBJU 1SPNJTFϕʔε ͕ಋೖ ೥,PUMJOFYQFSJNFOUBMBTZODBXBJU %FGFSSFE TVTQFOE

Slide 11

Slide 11 text

ඇಉظॲཧʹؔ͢Δ async/await دΓͷྺ࢙ ೥ϝϧϰΟϯɾίϯ΢ΣΠࢯͷ࿦จʹΑΔίϧʔνϯ͕ൃද ೥ΧʔϧɾώϡʔΠοτࢯɺϔϯϦʔɾϕΠΧʔࢯͷ࿦จʹΑΔ'VUVSF͕ൃද ೥$/&5'SBNFXPSLίϧʔνϯαϙʔτʢओʹZJFMEʣ ೥$Y/&5'SBNFXPSL3FBDUJWF&YUFOTJPOT 3Y ͕ಋೖ ೥$/&5'SBNFXPSLBTZODBXBJU 5BTLϕʔε ೥%BSUBTZODBXBJUʢ'VUVSFϕʔεʣ͕ಋೖ ೥+BWB4DSJQU&4 &4 BTZODBXBJU 1SPNJTFϕʔε ͕ಋೖ ೥,PUMJOFYQFSJNFOUBMBTZODBXBJU %FGFSSFE TVTQFOE 3Yͬͯ೥΋લͰ ͔ͭBTZODBXBJUΑΓ લͳΜͩͶʔ

Slide 12

Slide 12 text

ͯ͞͸ RxSwiftΞϯνͩͳ Φϝʔ ࢀߟϙϓςϐϐοΫIUUQNBOHBMJGFXJOUBLFTIPCPDPKQSFOTBJQPQVUF

Slide 13

Slide 13 text

RxSwift͸ϦΞΫςΟϒ͞ͱUIૢ࡞ʹؔͯ͠ ͱͯ΋૬ੑ͕ྑͯ͘࠷ߴ ςετίʔυ͸RxTest, RxBlocking͕͋ΔͷͰॻ͖΍͍͢ ࠓ೔͸৽͍͠ async/await ͷ࿩Λ͠·͕͢ ࠙਌ձͳͲͰRxSwiftؚΊͯඇಉظʹ͍ͭͯ৭ʑ ࿩͕͠Ͱ͖Ε͹ͱࢥͬͯ·͢ʂ

Slide 14

Slide 14 text

ϓϩϙʔβϧͷ async/awaitʹ͍ͭͯ

Slide 15

Slide 15 text

2017೥8݄

Slide 16

Slide 16 text

Swift Ͱ async/await Λ ಋೖ͢Δͱݴ͏ϓϩϙʔβϧͷυϥϑτ͕…

Slide 17

Slide 17 text

SwiftͷੜΈͷ਌ ΫϦεɾϥτφʔࢯ͔Β ౤ߘ͞Ε·ͨ͠!!!!!

Slide 18

Slide 18 text

ΫϦεͬͯ୭? ࢀߟϙϓςϐϐοΫIUUQNBOHBMJGFXJOUBLFTIPCPDPKQSFOTBJQPQVUF

Slide 19

Slide 19 text

ΫϦεͬͯ୭? ࢀߟϙϓςϐϐοΫIUUQNBOHBMJGFXJOUBLFTIPCPDPKQSFOTBJQPQVUF \ΤʔΠγϯΫ!/ \ΤʔΠγϯΫ!/

Slide 20

Slide 20 text

ΫϦεɾϥτφʔࢯ ࢀߟϙϓςϐϐοΫIUUQNBOHBMJGFXJOUBLFTIPCPDPKQSFOTBJQPQVUF

Slide 21

Slide 21 text

IUUQTHJTUHJUIVCDPNMBUUOFSCGCEDGD

Slide 22

Slide 22 text

ϓϩϙʔβϧͷશମ૾͸…

Slide 23

Slide 23 text

No content

Slide 24

Slide 24 text

No content

Slide 25

Slide 25 text

͜ͷϓϩϙʔβϧʹ͍ͭͯ ಈػίϯϓϦʔγϣϯϋϯυϥ͸࠷దͰ͸ͳ͍ ղܾࡦ͸ίϧʔνϯ 0CK$Πϯϙʔλͷม׵ طଘػೳͱͷ૬ޓ࡞༻ աڈͷίʔυͱͷޓ׵ੑ "#*TUBCJMJUZ΁ͷӨڹ ଞͷγϯλοΫε ୅ସҊ কདྷతͳํ޲ੑ ँࣙ

Slide 26

Slide 26 text

w ΫϩʔδϟͰίʔϧόοΫ͢Δͱίʔυ͕ωετ͍ͯͬͯ͠͠·͏ w ΤϥʔॲཧΛϋϯυϥ͝ͱʹॻ͘ͷ͸ࠔ೉ w ৚݅ʹΑͬͯΫϩʔδϟΛݺͼग़͢ͷ͸ۤ௧ w ؔ਺͕஋Λฦ͔͢ɺதஅ͢Δ͜ͱΛՄೳʹ͢Δ w δΣωϨʔλʢZJFMEʣ΍ඇಉظϞσϧͦͷଞͷػೳΛ࣮૷͢Δͷʹ࢖༻Ͱ͖Δ w ͜ͷϓϩϙʔβϧͰ͸ίϯϓϦʔγϣϯϋϯυϥͷଟ͘ͷ໰୊Λഉআ w ࠷΋ҰൠతͳϢʔεέʔεʹ޲໋໊͔ͬͯ๏ͱ༻ޠΛόΠΞε͢Δ w BTZOD͔ZJFMET͔ʹ͍ͭͯ͸ίΞηϚϯςΟΫεʹ͸ؔ܎͠ͳ͍ w தஅʹؔ͢Δ"1*ʢCFHJO"TZOD TVTQFOE"TZODʣ w 'VUVSFʹΑͬͯฒྻ࣮ߦΛߦ͏݅ w 0CK$ͷίϯϓϦʔγϣϯϋϯυϥϕʔεͷ"1*Λ 4XJGUͰ࢖͑ΔΑ͏ ม׵͢Δ w BTZODؔ਺΋UISPXTͰ͖ΔΑ͏ʹ͠ɺUSZBXBJUͰϋϯυϦϯάͰ͖ΔΑ͏ʹ͢Δ w ίϯύΠϥ͸Ϋϩʔδϟ͕ඇಉظ͔Ͳ͏͔؆୯ʹ൑ఆͰ͖Δ w EFGFS͸ίϧʔνϯ͕ഁغ͞Εͨࡍʹ΋ಈ࡞͢ΔΑ͏ʹ͢Δ w ʢϋϯυϥͳΒҾ਺Λ૿΍͕͢ʣBTZODͳSFUVSO͸݁ՌΛλϓϧͰฦͤΔ w ίϯύΠϥ͕ANZ2VFVFBTZOD\^Aͳهड़Λݕग़ͯ͠pYJUͰमਖ਼Ͱ͖Δ w "#*4UBCJMJUZʹӨڹ͠ͳ͍ w BTZODͳΒUISPXTͱ͢Δͱύλʔϯ͸ݮΔ͕ܽ఺͸͋Δ w BTZODͳΒσϑΥϧτUISPXTʹ͠ɺBTZOD OPOUISPXJOH ʹ͢Δͷ΋ܽ఺͸͋Δ w ίϧʔνϯΛ༻ҙ͍ͨ͠ͷͰ͋ͬͯBTZODBXBJUΛ࣮૷͍ͨ͠ͷͰ͸ͳ͍ w $ͷΑ͏ʹҰൠతͳBTZODBXBJU͸'VUVSFΫϥεΛฦ͢͜ͱʹͳΔ w ͦ͏ͳΔͱBTZODBXBJUΛݴޠϨϕϧͰ࣮૷͢Δ͜ͱʹͳͬͯ͠·͏ w ͜ͷఏҊ͸AYBXBJUGPP CBS AͷΑ͏ʹνΣΠχϯάΛ͏·͘Ͱ͖Δ w ۩ମྫ͸ͳ͍͕͜ͷఏҊ͔Βকདྷ΁ͷ֦ுੑɺ΍͍͖ͬͯΛड़΂͍ͯΔ ͜ͷϓϩϙʔβϧʹ͍ͭͯ ಈػίϯϓϦʔγϣϯϋϯυϥ͸࠷దͰ͸ͳ͍ ղܾࡦ͸ίϧʔνϯ 0CK$Πϯϙʔλͷม׵ طଘػೳͱͷ૬ޓ࡞༻ աڈͷίʔυͱͷޓ׵ੑ "#*TUBCJMJUZ΁ͷӨڹ ଞͷγϯλοΫε ୅ସҊ কདྷతͳํ޲ੑ ँࣙ

Slide 27

Slide 27 text

w ΫϩʔδϟͰίʔϧόοΫ͢Δͱίʔυ͕ωετ͍ͯͬͯ͠͠·͏ w ΤϥʔॲཧΛϋϯυϥ͝ͱʹॻ͘ͷ͸ࠔ೉ w ৚݅ʹΑͬͯΫϩʔδϟΛݺͼग़͢ͷ͸ۤ௧ w ؔ਺͕஋Λฦ͔͢ɺதஅ͢Δ͜ͱΛՄೳʹ͢Δ w δΣωϨʔλʢZJFMEʣ΍ඇಉظϞσϧͦͷଞͷػೳΛ࣮૷͢Δͷʹ࢖༻Ͱ͖Δ w ͜ͷϓϩϙʔβϧͰ͸ίϯϓϦʔγϣϯϋϯυϥͷଟ͘ͷ໰୊Λഉআ w ࠷΋ҰൠతͳϢʔεέʔεʹ޲໋໊͔ͬͯ๏ͱ༻ޠΛόΠΞε͢Δ w BTZOD͔ZJFMET͔ʹ͍ͭͯ͸ίΞηϚϯςΟΫεʹ͸ؔ܎͠ͳ͍ w தஅʹؔ͢Δ"1*ʢCFHJO"TZOD TVTQFOE"TZODʣ w 'VUVSFʹΑͬͯฒྻ࣮ߦΛߦ͏݅ w 0CK$ͷίϯϓϦʔγϣϯϋϯυϥϕʔεͷ"1*Λ 4XJGUͰ࢖͑ΔΑ͏ ม׵͢Δ w BTZODؔ਺΋UISPXTͰ͖ΔΑ͏ʹ͠ɺUSZBXBJUͰϋϯυϦϯάͰ͖ΔΑ͏ʹ͢Δ w ίϯύΠϥ͸Ϋϩʔδϟ͕ඇಉظ͔Ͳ͏͔؆୯ʹ൑ఆͰ͖Δ w EFGFS͸ίϧʔνϯ͕ഁغ͞Εͨࡍʹ΋ಈ࡞͢ΔΑ͏ʹ͢Δ w ʢϋϯυϥͳΒҾ਺Λ૿΍͕͢ʣBTZODͳSFUVSO͸݁ՌΛλϓϧͰฦͤΔ w ίϯύΠϥ͕ANZ2VFVFBTZOD\^Aͳهड़Λݕग़ͯ͠pYJUͰमਖ਼Ͱ͖Δ w "#*4UBCJMJUZʹӨڹ͠ͳ͍ w BTZODͳΒUISPXTͱ͢Δͱύλʔϯ͸ݮΔ͕ܽ఺͸͋Δ w BTZODͳΒσϑΥϧτUISPXTʹ͠ɺBTZOD OPOUISPXJOH ʹ͢Δͷ΋ܽ఺͸͋Δ w ίϧʔνϯΛ༻ҙ͍ͨ͠ͷͰ͋ͬͯBTZODBXBJUΛ࣮૷͍ͨ͠ͷͰ͸ͳ͍ w $ͷΑ͏ʹҰൠతͳBTZODBXBJU͸'VUVSFΫϥεΛฦ͢͜ͱʹͳΔ w ͦ͏ͳΔͱBTZODBXBJUΛݴޠϨϕϧͰ࣮૷͢Δ͜ͱʹͳͬͯ͠·͏ w ͜ͷఏҊ͸AYBXBJUGPP CBS AͷΑ͏ʹνΣΠχϯάΛ͏·͘Ͱ͖Δ w ۩ମྫ͸ͳ͍͕͜ͷఏҊ͔Βকདྷ΁ͷ֦ுੑɺ΍͍͖ͬͯΛड़΂͍ͯΔ ͜ͷϓϩϙʔβϧʹ͍ͭͯ ಈػίϯϓϦʔγϣϯϋϯυϥ͸࠷దͰ͸ͳ͍ ղܾࡦ͸ίϧʔνϯ 0CK$Πϯϙʔλͷม׵ طଘػೳͱͷ૬ޓ࡞༻ աڈͷίʔυͱͷޓ׵ੑ "#*TUBCJMJUZ΁ͷӨڹ ଞͷγϯλοΫε ୅ସҊ কདྷతͳํ޲ੑ ँࣙ

Slide 28

Slide 28 text

async/awaitͷͨΊʹSwift͕ఏڙͯ͘͠ΕΔ΋ͷ • म০ࢠʢΩʔϫʔυʣ • async • await • ίϧʔνϯAPI • beginAsync • suspendAsync

Slide 29

Slide 29 text

async/awaitͷͨΊʹSwift͕ఏڙͯ͘͠ΕΔ΋ͷ • म০ࢠʢΩʔϫʔυʣ • async • await • ίϧʔνϯAPI • beginAsync • suspendAsync ͜Ε͑͞ཧղͰ͖Ε͹ΑΓΑ͘࢖͑Δ

Slide 30

Slide 30 text

async/awaitͷίʔυྫʢٖࣅίʔυͰ͢ʣ // async/await @IBAction func touchUpButton(_ sender: Any) { beginAsync { let image = await ௨৴ͯ͠ը૾औಘ͢Δ() imageView.image = image } } // ैདྷͷίϯϓϦʔγϣϯϋϯυϥํࣜ @IBAction func touchUpButton(_ sender: Any) { ௨৴ͯ͠ը૾औಘ͢Δ() { image in imageView.image = image } }

Slide 31

Slide 31 text

async/awaitͷίʔυྫʢٖࣅίʔυͰ͢ʣ // async/await @IBAction func touchUpButton(_ sender: Any) { beginAsync { let image = await ௨৴ͯ͠ը૾औಘ͢Δ() imageView.image = image } } // ैདྷͷίϯϓϦʔγϣϯϋϯυϥํࣜ @IBAction func touchUpButton(_ sender: Any) { ௨৴ͯ͠ը૾औಘ͢Δ() { image in imageView.image = image } } CFHJO"TZODͷதͰ BXBJUΩʔϫʔυΛ͚ͭΔ ͜ͱͰಉظॲཧͷΑ͏ʹॻ͚Δ

Slide 32

Slide 32 text

async/awaitͷίʔυྫɿؔ਺ͷఆٛ // ؔ਺ͷఆٛ func ௨৴ͯ͠ը૾औಘ͢Δ() async -> Image {}

Slide 33

Slide 33 text

async/awaitͷίʔυྫɿؔ਺ͷఆٛ // ؔ਺ͷఆٛ func ௨৴ͯ͠ը૾औಘ͢Δ() async -> Image {} BXBJU͢Δؔ਺ఆٛʹ͸ BTZODΩʔϫʔυΛ͚ͭΔ

Slide 34

Slide 34 text

ෳ਺ͷawaitͷྫʢٖࣅίʔυͰ͢ʣ @IBAction func touchUpButton(_ sender: Any) { beginAsync { let src = await ௨৴ͯ͠ը૾औಘ͢Δ() let image = await දࣔ༻ʹը૾Ճ޻͢Δ(src) imageView.image = image } }

Slide 35

Slide 35 text

ෳ਺ͷawaitͷྫʢٖࣅίʔυͰ͢ʣ @IBAction func touchUpButton(_ sender: Any) { beginAsync { let src = await ௨৴ͯ͠ը૾औಘ͢Δ() let image = await දࣔ༻ʹը૾Ճ޻͢Δ(src) imageView.image = image } } ෳ਺ͷBXBJUͰ Ұ࣮ͭͣͭߦͰ͖Δ

Slide 36

Slide 36 text

@IBAction func touchUpButton(_ sender: Any) { beginAsync { do { let image = try await ը૾औಘ͢Δ() imageView.image = image } catch CocoaError.userCanccelled { // Ϣʔβ͕ࣗ෼ͰΩϟϯηϧͨ͠ͷͰԿ΋͠ͳ͍ } catch { present(error) } } } ΤϥʔϋϯυϦϯά͸EP DBUDI USZ͕࢖͑Δʢٖࣅίʔυʣ

Slide 37

Slide 37 text

@IBAction func touchUpButton(_ sender: Any) { beginAsync { do { let image = try await ը૾औಘ͢Δ() imageView.image = image } catch CocoaError.userCanccelled { // Ϣʔβ͕ࣗ෼ͰΩϟϯηϧͨ͠ͷͰԿ΋͠ͳ͍ } catch { present(error) } } } ΤϥʔϋϯυϦϯά͸EP DBUDI USZ͕࢖͑Δʢٖࣅίʔυʣ ίϯϓϦʔγϣϯϋϯυ ϥํࣜͷΑ͏ʹFSSPSΛҾ਺Ͱ ౉͞ͳͯ͘΋ྑ͘ͳΔ

Slide 38

Slide 38 text

asyncؔ਺ͷthrowsͷఆٛํ๏͸2ύλʔϯࣔ͞Ε͍ͯΔ ύλʔϯΤϥʔΛUISPXT͍ͨ͠ͳΒUISPXT͚ͭΔ ύλʔϯΤϥʔΛUISPXTͨ͘͠ͳ͍ͳΒOPOUISPXJOH

Slide 39

Slide 39 text

// Τϥʔ͕͋Ε͹ throw ͢Δͱఆٛ͢Δ func ը૾औಘ͢Δ() async throws -> UIImage {} // Τϥʔ͸ throw ͠ͳ͍ͱఆٛ͢Δ func ը૾औಘ͢Δ() async -> UIImage {} asyncؔ਺ͷthrowsͷఆٛํ๏͸2ύλʔϯࣔ͞Ε͍ͯΔ ύλʔϯΤϥʔΛUISPXT͍ͨ͠ͳΒUISPXT͚ͭΔ ύλʔϯΤϥʔΛUISPXTͨ͘͠ͳ͍ͳΒOPOUISPXJOH

Slide 40

Slide 40 text

// Τϥʔ͕͋Ε͹ throw ͢Δͱఆٛ͢Δ func ը૾औಘ͢Δ() async throws -> UIImage {} // Τϥʔ͸ throw ͠ͳ͍ͱఆٛ͢Δ func ը૾औಘ͢Δ() async -> UIImage {} // Τϥʔ͸ throw ͠ͳ͍ͱఆٛ͢Δ func ը૾औಘ͢Δ() async(nonthrowing) -> UIImage {} // async ͸ throws ͱΈͳ͞ΕΔ func ը૾औಘ͢Δ() async -> UIImage {} asyncؔ਺ͷthrowsͷఆٛํ๏͸2ύλʔϯࣔ͞Ε͍ͯΔ ύλʔϯΤϥʔΛUISPXT͍ͨ͠ͳΒUISPXT͚ͭΔ ύλʔϯΤϥʔΛUISPXTͨ͘͠ͳ͍ͳΒOPOUISPXJOH

Slide 41

Slide 41 text

// Τϥʔ͕͋Ε͹ throw ͢Δͱఆٛ͢Δ func ը૾औಘ͢Δ() async throws -> UIImage {} // Τϥʔ͸ throw ͠ͳ͍ͱఆٛ͢Δ func ը૾औಘ͢Δ() async -> UIImage {} // Τϥʔ͸ throw ͠ͳ͍ͱఆٛ͢Δ func ը૾औಘ͢Δ() async(nonthrowing) -> UIImage {} // async ͸ throws ͱΈͳ͞ΕΔ func ը૾औಘ͢Δ() async -> UIImage {} asyncؔ਺ͷthrowsͷఆٛํ๏͸2ύλʔϯࣔ͞Ε͍ͯΔ (JU)VCʹ͋Δ4XJGU ͷ1VMM3FRVFTUʹ͸ͪ͜Βͷ࣮૷͕ॻ͔ Ε͍ͯΔ ύλʔϯΤϥʔΛUISPXT͍ͨ͠ͳΒUISPXT͚ͭΔ ύλʔϯΤϥʔΛUISPXTͨ͘͠ͳ͍ͳΒOPOUISPXJOH

Slide 42

Slide 42 text

ࢀߟϙϓςϐϐοΫIUUQNBOHBMJGFXJOUBLFTIPCPDPKQSFOTBJQPQVUF ͜͜·ͰͰɺϓϩϙʔβϧʹॻ͔Ε͍ͯΔ͜ͱ ·ͱΊ • ίϧʔνϯAPIͷbeginAsync͕ඇಉظ࣮ߦͷ։࢝୯Ґͱͳ͍ͬͯΔ • awaitͰ݁Ռͷ஋Λͦͷ··औΓग़ͤΔ • ؔ਺ఆٛ͸async throws͔async(nonthrowing)ͷ2ύλʔϯ

Slide 43

Slide 43 text

• async/await͸ฒྻॲཧͷ։࢝Λهड़Ͱ͖ͳ͍ async/awaitͷۤखͳ͜ͱ

Slide 44

Slide 44 text

͜Ε͕async/await஍ࠈʁ(ٖࣅίʔυ) @IBAction func touchUpButton(_ sender: Any) { beginAsync { let src1 = await ௨৴ͯ͠ը૾औಘ͢Δ() let src2 = await ௨৴ͯ͠ը૾औಘ͢Δ() let image = ը૾߹੒͢Δ(src1, src2) imageView.image = image } }

Slide 45

Slide 45 text

͜Ε͕async/await஍ࠈʁ(ٖࣅίʔυ) @IBAction func touchUpButton(_ sender: Any) { beginAsync { let src1 = await ௨৴ͯ͠ը૾औಘ͢Δ() let src2 = await ௨৴ͯ͠ը૾औಘ͢Δ() let image = ը૾߹੒͢Δ(src1, src2) imageView.image = image } } ಉ࣌ʹݺͼग़ͤΕ͹͍͍ͷʹ ແବʹBXBJUͯ͠͠·͏

Slide 46

Slide 46 text

ࢀߟϙϓςϐϐοΫIUUQNBOHBMJGFXJOUBLFTIPCPDPKQSFOTBJQPQVUF ฒྻ࣮ߦ͸FutureΛ࢖͏

Slide 47

Slide 47 text

FutureΛ࢖ͬͯฒྻ࣮ߦ͢ΔྫʢٖࣅίʔυͰ͢ʣ @IBAction func touchUpButton(_ sender: Any) { beginAsync { let f1 = Future { await ௨৴ͯ͠ը૾औಘ͢Δ() } let f2 = Future { await ௨৴ͯ͠ը૾औಘ͢Δ() } let image = ը૾߹੒͢Δ(try await f1.get(), try await f2.get()) imageView.image = image } }

Slide 48

Slide 48 text

FutureΛ࢖ͬͯฒྻ࣮ߦ͢ΔྫʢٖࣅίʔυͰ͢ʣ @IBAction func touchUpButton(_ sender: Any) { beginAsync { let f1 = Future { await ௨৴ͯ͠ը૾औಘ͢Δ() } let f2 = Future { await ௨৴ͯ͠ը૾औಘ͢Δ() } let image = ը૾߹੒͢Δ(try await f1.get(), try await f2.get()) imageView.image = image } } BXBJUͯ͠Δ͚Ͳ 'VUVSFͷΠχγϟϥΠβ ͸಺෦ͰCFHJO"TZOD͢Δ HFUϝιουͰ଴ͬͯ͘ΕΔ

Slide 49

Slide 49 text

class Future { private enum Result { case error(Error), value(T) } private var result: Result? = nil private var awaiters: [(Result) -> Void] = [] // Fulfill the future, and resume any coroutines waiting for the value. func fulfill(_ value: T) { precondition(self.result == nil, "can only be fulfilled once") let result = .value(value) self.result = result for awaiter in awaiters { awaiter(result) } awaiters = [] } // Mark the future as having failed to produce a result. func fail(_ error: Error) { precondition(self.result == nil, "can only be fulfilled once") let result = .error(error) self.result = result for awaiter in awaiters { awaiter(result) } awaiters = [] } func get() async throws -> T { switch result { // Throw/return the result immediately if available. case .error(let e)?: throw e case .value(let v)?: return v // Wait for the future if no result has been fulfilled. case nil: return await suspendAsync { continuation, error in awaiters.append({ switch $0 { case .error(let e): error(e) case .value(let v): continuation(v) } }) } } } // Create an unfulfilled future. init() {} convenience init(_ body: () async -> T) { self.init() beginAsync { do { self.fulfill(await body()) } catch { self.fail(error) } } } } class Future w ϓϩϙʔβϧʹ͸ΫϦε͞Μͷ࣮૷ྫ w ଞͷݴޠͰ͸1SPNJTF5BTL%FGFSSFE͕͋Δ

Slide 50

Slide 50 text

class Future { private enum Result { case error(Error), value(T) } private var result: Result? = nil private var awaiters: [(Result) -> Void] = [] // Fulfill the future, and resume any coroutines waiting for the value. func fulfill(_ value: T) { precondition(self.result == nil, "can only be fulfilled once") let result = .value(value) self.result = result for awaiter in awaiters { awaiter(result) } awaiters = [] } // Mark the future as having failed to produce a result. func fail(_ error: Error) { precondition(self.result == nil, "can only be fulfilled once") let result = .error(error) self.result = result for awaiter in awaiters { awaiter(result) } awaiters = [] } func get() async throws -> T { switch result { // Throw/return the result immediately if available. case .error(let e)?: throw e case .value(let v)?: return v // Wait for the future if no result has been fulfilled. case nil: return await suspendAsync { continuation, error in awaiters.append({ switch $0 { case .error(let e): error(e) case .value(let v): continuation(v) } }) } } } // Create an unfulfilled future. init() {} convenience init(_ body: () async -> T) { self.init() beginAsync { do { self.fulfill(await body()) } catch { self.fail(error) } } } } class Future w ϓϩϙʔβϧʹ͸ΫϦε͞Μͷ࣮૷ྫ w ଞͷݴޠͰ͸1SPNJTF5BTL%FGFSSFE͕͋Δ HFUϝιουͰ TVTQFOE"TZODΛ࢖͍ͬͯΔͷͰ͜Ε ΛཧղͰ͖Ε͹͞ΒʹBTZODBXBJUΛ׬ શʹཧղͰ͖ͦ͏

Slide 51

Slide 51 text

Futureͷgetϝιουͷ આ໌ͷͨΊʹ Ұ୴ suspendAsync ʹ͍ͭͯઆ໌

Slide 52

Slide 52 text

func suspendAsync( _ body: (_ continuation: @escaping (T) -> (), _ error: @escaping (Error) -> ()) -> () ) async throws -> T suspendAsync ͸ ैདྷͷίϯϓϦʔγϣϯϋϯυϥܕͷؔ਺Λ async/await ͷؔ਺ʹͰ͖Δ΋ͷ

Slide 53

Slide 53 text

func suspendAsync( _ body: (_ continuation: @escaping (T) -> (), _ error: @escaping (Error) -> ()) -> () ) async throws -> T Ҿ਺ͷDPOUJOVBUJPOΫϩʔδϟ͸ ࠶։͍ͨ͠ॲཧͱ஋Λ౉͢ suspendAsync ͸ ैདྷͷίϯϓϦʔγϣϯϋϯυϥܕͷؔ਺Λ async/await ͷؔ਺ʹͰ͖Δ΋ͷ

Slide 54

Slide 54 text

suspendAsync ͷར༻ྫʢΤϥʔ͸লུʣ // ίʔϧόοΫAPIΛasync/awaitԽ͢Δϥούʔ func getStuff() async -> Stuff { return await suspendAsync { continuation in // ↓ैདྷͷίʔϧόοΫAPIΛݺͼग़͢ getStuff { stuff in // ඇಉظॲཧ׬ྃޙʹcontinuationΛ࣮ߦ continuation(stuff) } } } // ैདྷͷΫϩʔδϟͰ݁ՌΛฦ͢ίʔϧόοΫAPI func getStuff(completion: (Stuff) -> ()) { ... }

Slide 55

Slide 55 text

suspendAsync ͷར༻ྫʢΤϥʔ͸লུʣ // ίʔϧόοΫAPIΛasync/awaitԽ͢Δϥούʔ func getStuff() async -> Stuff { return await suspendAsync { continuation in // ↓ैདྷͷίʔϧόοΫAPIΛݺͼग़͢ getStuff { stuff in // ඇಉظॲཧ׬ྃޙʹcontinuationΛ࣮ߦ continuation(stuff) } } } // ैདྷͷΫϩʔδϟͰ݁ՌΛฦ͢ίʔϧόοΫAPI func getStuff(completion: (Stuff) -> ()) { ... } λεΫͷऴྃ࣌ʹDPOUJOVBUJPOΫ ϩʔδϟΛݺͼग़͠

Slide 56

Slide 56 text

ೲಘ͠ͳ͍ͱઌʹਐΊͳ͍ϙΠϯτ • ίϧʔνϯAPIͱͯ͠ఏڙ͞ΕΔ suspendAsync ͸ • Ҿ਺ continuation ΫϩʔδϟΛݺͼग़͢ͱ async ؔ਺ͱ ͳΓ await Ͱ͖ΔΑ͏ʹͳΔ

Slide 57

Slide 57 text

class Future { // লུ … convenience init(_ body: () async -> T) { self.init() beginAsync { do { self.fulfill(await body()) } catch { self.fail(error) } } } } ·ͣ Future ͷΠχγϟϥΠβ͔ΒίʔυΛݟͯΈΔ

Slide 58

Slide 58 text

class Future { // লུ … convenience init(_ body: () async -> T) { self.init() beginAsync { do { self.fulfill(await body()) } catch { self.fail(error) } } } } ·ͣ Future ͷΠχγϟϥΠβ͔ΒίʔυΛݟͯΈΔ ฒྻ࣮ߦ͍ͨ͠ίʔυΛ ඇಉظͰݺͼग़͠BXBJU͠ ݁ՌΛGVMpMMʹ౉͢ɻ

Slide 59

Slide 59 text

class Future { private enum Result { case error(Error), value(T) } private var awaiters: [(Result) -> Void] = [] // লུ … func get() async throws -> T { switch result { // Throw/return the result immediately if available. case .error(let e)?: throw e case .value(let v)?: return v // Wait for the future if no result has been fulfilled. case nil: return await suspendAsync { continuation, error in awaiters.append({ switch $0 { case .error(let e): error(e) case .value(let v): continuation(v) } }) } } } } Futureͷget͸ʁ

Slide 60

Slide 60 text

class Future { private enum Result { case error(Error), value(T) } private var awaiters: [(Result) -> Void] = [] // লུ … func get() async throws -> T { switch result { // Throw/return the result immediately if available. case .error(let e)?: throw e case .value(let v)?: return v // Wait for the future if no result has been fulfilled. case nil: return await suspendAsync { continuation, error in awaiters.append({ switch $0 { case .error(let e): error(e) case .value(let v): continuation(v) } }) } } } } Futureͷget͸ʁ HFUΑΓલʹॲཧ׬ྃ͠GVMpMM͞Εͯ Ε͹HFU͞ΕͨΒ͙݁͢ՌΛฦ͢

Slide 61

Slide 61 text

class Future { private enum Result { case error(Error), value(T) } private var awaiters: [(Result) -> Void] = [] // লུ … func get() async throws -> T { switch result { // Throw/return the result immediately if available. case .error(let e)?: throw e case .value(let v)?: return v // Wait for the future if no result has been fulfilled. case nil: return await suspendAsync { continuation, error in awaiters.append({ switch $0 { case .error(let e): error(e) case .value(let v): continuation(v) } }) } } } } HFUΑΓલʹGVMpMM͞Εͯͳ͚Ε͹ BXBJUFSΫϩʔδϟ഑ྻʹ DPOUJOVBUJPOΛ ݺͼग़͢ΫϩʔδϟΛBQQFOE͠ GVMpMM͞ΕͨλΠϛϯάͰ݁ՌΛฦͤΔ Futureͷget͸ʁ HFUΑΓલʹॲཧ׬ྃ͠GVMpMM͞Εͯ Ε͹HFU͞ΕͨΒ͙݁͢ՌΛฦ͢

Slide 62

Slide 62 text

class Future { private enum Result { case error(Error), value(T) } private var result: Result? = nil private var awaiters: [(Result) -> Void] = [] // লུ … func fulfill(_ value: T) { precondition(self.result == nil, "can only be fulfilled once") let result = .value(value) self.result = result for awaiter in awaiters { awaiter(result) } awaiters = [] } } ࣍ʹFutureͷfulfill͕Ͳ͏ͳ͍ͬͯΔ͔

Slide 63

Slide 63 text

class Future { private enum Result { case error(Error), value(T) } private var result: Result? = nil private var awaiters: [(Result) -> Void] = [] // লུ … func fulfill(_ value: T) { precondition(self.result == nil, "can only be fulfilled once") let result = .value(value) self.result = result for awaiter in awaiters { awaiter(result) } awaiters = [] } } Ҿ਺͔Β݁ՌΛ3FTVMUͱ͠ BXBJUFSΫϩʔδϟ഑ྻʹ͋ΔΫϩʔδϟΛ 3FTVMUΛҾ਺ʹݺͼग़͠ ࣍ʹFutureͷfulfill͕Ͳ͏ͳ͍ͬͯΔ͔

Slide 64

Slide 64 text

ࢀߟϙϓςϐϐοΫIUUQNBOHBMJGFXJOUBLFTIPCPDPKQSFOTBJQPQVUF ͋ʔͦʔΏʔ͜ͱͶ ׬શʹཧղͨ͠

Slide 65

Slide 65 text

͞ΒʹFutureʹ͍ͭͯϓϩϙʔβϧʹॻ͔ Ε͍ͯΔ͜ͱ

Slide 66

Slide 66 text

ࢀߟϙϓςϐϐοΫIUUQNBOHBMJGFXJOUBLFTIPCPDPKQSFOTBJQPQVUF • C#͸await࣌ʹTaskͷΠϯελϯεΛฦ͍ͯ͠Δ • await͢Δ͝ͱʹΠϯελϯεΛ࡞ΔͱΦʔόʔϔο υ͕ൃੜ͢ΔͷͰSwiftͰ͸FutureΛฦ͞ͳ͍ awaitͨ͠ϝιου͸݁ՌΛͦͷ··ฦ͢ ࢀߟϙϓςϐϐοΫIUUQNBOHBMJGFXJOUBLFTIPCPDPKQSFOTBJQPQVUF

Slide 67

Slide 67 text

ࢀߟϙϓςϐϐοΫIUUQNBOHBMJGFXJOUBLFTIPCPDPKQSFOTBJQPQVUF • ݁ՌͷܕTͷ஋Λͦͷ··ฦ͢͜ͱͰࣗવͳϝιουνΣΠϯ ͕Ͱ͖ΔΑ͏ʹͳΔ • x = await foo().bar()ͷΑ͏ʹͰ͖Δ • C#͸ x = await (await foo()).bar()ͷΑ͏ʹͳΔ ͦͷଞͷϝϦοτ ࢀߟϙϓςϐϐοΫIUUQNBOHBMJGFXJOUBLFTIPCPDPKQSFOTBJQPQVUF

Slide 68

Slide 68 text

ͭ·Γ • Swift͸ܰྔͳίϧʔνϯΛఏڙ • await͢Δࡍʹ͸஋Λͦͷ··ฦ͢ • ࢖͍উखͷྑ͞Λ࣮ݱ͠Α͏ͱ͍ͯ͠Δ • ϝιουνΣʔϯΛ΍Γ΍͘͢

Slide 69

Slide 69 text

ࢀߟϙϓςϐϐοΫIUUQNBOHBMJGFXJOUBLFTIPCPDPKQSFOTBJQPQVUF ͔͠͠ Future͸async/await ϓϩϙʔβϧͷൣғ֎ ࢀߟϙϓςϐϐοΫIUUQNBOHBMJGFXJOUBLFTIPCPDPKQSFOTBJQPQVUF

Slide 70

Slide 70 text

ࢀߟϙϓςϐϐοΫIUUQNBOHBMJGFXJOUBLFTIPCPDPKQSFOTBJQPQVUF w ίϧʔνϯͷϓϩϙʔβϧ͕ड͚ೖΕΒΕͨޙ ʹ'VUVSF࣮૷ʹ͍ͭͯٞ࿦ͨ͠ํ͕༗ҙٛ ࢀߟϙϓςϐϐοΫIUUQNBOHBMJGFXJOUBLFTIPCPDPKQSFOTBJQPQVUF

Slide 71

Slide 71 text

࣍ͷٙ໰ (Swiftͷ)ίϧʔνϯͬͯԿ?

Slide 72

Slide 72 text

ίϧʔνϯ =

Slide 73

Slide 73 text

ίϧʔνϯ = async/await

Slide 74

Slide 74 text

Ͱ͸ͳ͍

Slide 75

Slide 75 text

ίϧʔνϯ =

Slide 76

Slide 76 text

ίϧʔνϯ = (C#, Kotlin, JS) yield

Slide 77

Slide 77 text

Ͱ΋ͳ͍

Slide 78

Slide 78 text

Α͋͘Δίϧʔνϯͷఆٛ • ॲཧΛதஅͨ͠Γ࠶։ΛϩδοΫͰՄೳʹ͢Δ • ॲཧΛ࠶։͢ΔεϨου͸ɺಉ͡εϨουͰ͋ͬͨΓผͷ εϨουͩͬͨΓ͢Δ

Slide 79

Slide 79 text

BTZODBXBJU ZJFME ίϧʔνϯͱ͍͏֓೦ ར༻ྫ

Slide 80

Slide 80 text

ίϧʔνϯͷதஅͱ࠶։ͷ ࢓૊Έʹ͍ͭͯ

Slide 81

Slide 81 text

• தஅͱ࠶։Λ࣮ݱ͢ΔͨΊɺίϧʔνϯ༻ʹεςʔτϚγϯͷ struct/classΛίϯύΠϥ͕ࣗಈੜ੒͢Δ • C#Ͱ͸ίϧʔνϯ༻ͷεςʔτϚγϯstruct • KotlinͰ͸ίϧʔνϯ༻ͷεςʔτϚγϯclass ίϧʔνϯΛ࣮ݱͯ͠ΔC#΍Kotlin

Slide 82

Slide 82 text

$ίϯύΠϥ // ϓϩάϥϚ͕ॻ͍ͨasync/awaitΛ࢖͏C#ίʔυ தؒݴޠ*- ϓϩάϥϚ͕ॻ͍ͨBTZODBXBJUίʔυΛ $ίϯύΠϥ͸ίϧʔνϯ༻ͷTUSVDUΛͭ͘Γ ͦ͜ͰίʔυΛࣗಈͰॻ͖ม͑Δ C#ͷ৔߹ 8JOEPXT -JOVY

Slide 83

Slide 83 text

private struct StateMachine : IAsyncStateMachine { public int state; // ະॲཧ, ॲཧத, ॲཧ׬ྃ, ΤϥʔͷΑ͏ʹ࢖ΘΕΔ private TaskAwaiter awaiter; public void MoveNext() { try { // stateʹΑΔ෼ذॲཧ͕͋Γɺඇಉظॲཧ͸ίʔϧόοΫʹొ࿥͞ΕΔ // ϓϩάϥϚ͕ॻ͍ͨasync/awaitΛ࢖͏ίʔυ͕await࢖Θͳ͍ܗͰ͜ͷՕॴʹདྷΔ } catch (Exception exception) { this.state = -2; return; } } } async double CalcAsync(double r) { await Task.Delay(1000) return r } ϓϩάϥϚ͕ॻ͍ͨasync/awaitΛ࢖͏ίʔυͷྫ ίϯύΠϥʹΑͬͯࣗಈੜ੒͞ΕΔίʔυͷ Ұ෦෼Λলུ͠ൈਮͨ͠΋ͷ

Slide 84

Slide 84 text

,PUMJOίϯύΠϥ // ϓϩάϥϚ͕ॻ͍ͨasync/awaitΛ࢖͏Kotlinίʔυ όΠτίʔυ ϓϩάϥϚ͕ॻ͍ͨBTZODBXBJUίʔυΛ ,PUMJOίϯύΠϥ͸ίϧʔνϯ༻ͷόΠτίʔυͷϨϕϧ ͰDMBTTʹ૬౰͢Δ΋ͷࣗಈͰॻ͖׵͑Δ Kotlinͷ৔߹

Slide 85

Slide 85 text

ͭ·Γ ίϧʔνϯͷBTZODBXBJUͱ͍͏ͷ͸ ϓϩάϥϚͷBXBJUΛ࢖ͬͨಉظॲཧ෩ͳίʔυΛ ίϯύΠϥʹΑΓຊདྷͷඇಉظॲཧίʔυʹ ॻ͖׵͑ΒΕ͍ͯΔ ͜ͷ͜ͱΛϓϩϙʔβϧͰ͸ʜ

Slide 86

Slide 86 text

ࢀߟϙϓςϐϐοΫIUUQNBOHBMJGFXJOUBLFTIPCPDPKQSFOTBJQPQVUF ఏҊ͢Δίϧʔνϯ͸ ίϯϓϦʔτϋϯυϥͷ γϯλοΫεγϡΨʔʢ౶ҥߏจʣ ͱߟ͑ΒΕΔ ࢀߟϙϓςϐϐοΫIUUQNBOHBMJGFXJOUBLFTIPCPDPKQSFOTBJQPQVUF

Slide 87

Slide 87 text

SwiftͰ ίϧʔνϯ͕class/structʹͳΔ͔ͱ͍͏ͱ

Slide 88

Slide 88 text

ࢀߟϙϓςϐϐοΫIUUQNBOHBMJGFXJOUBLFTIPCPDPKQSFOTBJQPQVUF ʢίϧʔνϯΛstruct΋͘͠͸classʹ͢Δ͔ ɹͲ͏͔͸ϓϩϙʔβϧͷυϥϑτʹ͸ ɹ͸͖ͬΓͱ͸ॻ͔Εͯͳ͍͕ʣ εςʔτϚγϯͰϩδοΫΛ࣮૷͢Δ

Slide 89

Slide 89 text

ίʔϧόοΫAPIͰ͋ΔbeginAsyncʹғ·ΕΔείʔϓ΍ ؔ਺ͷasyncΩʔϫʔυ͸ SwiftίϯύΠϥʹΑΓॻ͖׵͑ΒΕΔର৅ͷ1୯Ґ ͱ૝૾Ͱ͖Δ

Slide 90

Slide 90 text

͜͜·ͰΘ্͔ͬͨͰ ࣮ફతʹ Swiftͷasync/awaitͰ ආ͚Δ΂͖͜ͱ

Slide 91

Slide 91 text

beginAsync಺Ͱωετ͞ΕΔͱಡΉͷ͕ΩπΠ @IBAction func touchUpButton(_ sender: Any) { beginAsync { let src = await ௨৴ͯ͠ը૾औಘ͢Δ() CoreSpotlight༻ʹը૾Ճ޻͢Δ(src) { image in addSpotlight(image) { self.saved = true } } let image = await දࣔ༻ʹը૾Ճ޻͢Δ(src) imageView.image = image } }

Slide 92

Slide 92 text

beginAsync಺Ͱωετ͞ΕΔͱಡΉͷ͕ΩπΠ @IBAction func touchUpButton(_ sender: Any) { beginAsync { let src = await ௨৴ͯ͠ը૾औಘ͢Δ() CoreSpotlight༻ʹը૾Ճ޻͢Δ(src) { image in addSpotlight(image) { self.saved = true } } let image = await දࣔ༻ʹը૾Ճ޻͢Δ(src) imageView.image = image } } ͭ໨ͷBXBJUͷؒʹ΍Δҙຯ ͸͋ΔͩΖ͏͚Ͳ ωετ͕ؾʹͳͬͯ͠·͏

Slide 93

Slide 93 text

await͔Β࠶։࣮ͨ͠ߦεϨου͸ Ͳ͏ͳΔͷ͔

Slide 94

Slide 94 text

ࢀߟϙϓςϐϐοΫIUUQNBOHBMJGFXJOUBLFTIPCPDPKQSFOTBJQPQVUF ίϧʔνϯͷಋೖʹΑͬͯ΋ Ωϡʔ͸มߋ͞Εͳ͍

Slide 95

Slide 95 text

ͭ·ΓͲ͏͍͏͜ͱͩͬͯ͹Α…

Slide 96

Slide 96 text

awaitͨؔ͠਺Λॲཧͨ͠Ωϡʔʹґଘ͢Δ func queueHopping() async -> Void { doSomeStuff() await DispatchQueue.main.syncCoroutine() // Ҏ߱ϝΠϯεϨουͰͷૢ࡞ʹͳΔ doSomeStuffOnMainThread() await backgroundQueue.asyncCoroutine() // Ҏ߱ϝΠϯͰͳ͍εϨουͰͷૢ࡞ʹͳΔ doSomeStuffInBackground() }

Slide 97

Slide 97 text

awaitͨؔ͠਺Λॲཧͨ͠Ωϡʔʹґଘ͢Δ func queueHopping() async -> Void { doSomeStuff() await DispatchQueue.main.syncCoroutine() // Ҏ߱ϝΠϯεϨουͰͷૢ࡞ʹͳΔ doSomeStuffOnMainThread() await backgroundQueue.asyncCoroutine() // Ҏ߱ϝΠϯͰͳ͍εϨουͰͷૢ࡞ʹͳΔ doSomeStuffInBackground() } ϝΠϯΩϡʔΛಉظ

Slide 98

Slide 98 text

awaitͨؔ͠਺Λॲཧͨ͠Ωϡʔʹґଘ͢Δ func queueHopping() async -> Void { doSomeStuff() await DispatchQueue.main.syncCoroutine() // Ҏ߱ϝΠϯεϨουͰͷૢ࡞ʹͳΔ doSomeStuffOnMainThread() await backgroundQueue.asyncCoroutine() // Ҏ߱ϝΠϯͰͳ͍εϨουͰͷૢ࡞ʹͳΔ doSomeStuffInBackground() } ϝΠϯΩϡʔΛಉظ όοΫάϥ΢ϯυ ΩϡʔΛಉظ

Slide 99

Slide 99 text

΋͠௨৴ͯ͠ը૾औಘ͢Δͷ͕ผεϨουͳΒ… @IBAction func touchUpButton(_ sender: Any) { beginAsync { let image = await ϝΠϯεϨου֎Ͱ௨৴ͯ͠ը૾औಘ͢Δ() DispatchQueue.main.async { // ϝΠϯεϨουʹ੾Γସ͑ͯViewΛૢ࡞ imageView.image = image } } }

Slide 100

Slide 100 text

΋͠௨৴ͯ͠ը૾औಘ͢Δͷ͕ผεϨουͳΒ… @IBAction func touchUpButton(_ sender: Any) { beginAsync { let image = await ϝΠϯεϨου֎Ͱ௨৴ͯ͠ը૾औಘ͢Δ() DispatchQueue.main.async { // ϝΠϯεϨουʹ੾Γସ͑ͯViewΛૢ࡞ imageView.image = image } } } ैདྷͷ%JTQBUDI2VFVFNBJO Ͱ΋੾Γସ͑Ͱ͖Δ͕ʜ ੾Γସ͑΍Γͨ͘Ͷʔͳʔ

Slide 101

Slide 101 text

ཁ๬ɿ ϗϯτ͸͜͏ͳͬͯཉ͍͠ΑͶ… @IBAction func touchUpButton(_ sender: Any) { beginAsync(.main) { let image = await ϝΠϯεϨου֎Ͱ௨৴ͯ͠ը૾औಘ͢Δ() // ͜͜ͷίϯςΩετ͸ϝΠϯεϨουͳͷͰͦͷ··ViewΛૢ࡞ imageView.image = image } }

Slide 102

Slide 102 text

ཁ๬ɿ ϗϯτ͸͜͏ͳͬͯཉ͍͠ΑͶ… @IBAction func touchUpButton(_ sender: Any) { beginAsync(.main) { let image = await ϝΠϯεϨου֎Ͱ௨৴ͯ͠ը૾औಘ͢Δ() // ͜͜ͷίϯςΩετ͸ϝΠϯεϨουͳͷͰͦͷ··ViewΛૢ࡞ imageView.image = image } } CFHJO"TZODͷ Ҿ਺ʹΩϡʔΛࢦఆ͠ ίϯςΩετΛࢦఆͤͯ͞Α

Slide 103

Slide 103 text

࠷ޙʹ ࣮͸ϥΠϒϥϦͰasync/await ΋͏࢖͑ΔΜͰ͢

Slide 104

Slide 104 text

• malcommac/Hydra • https://github.com/malcommac/Hydra • ಛ௃ • JSͷasync/awaitΛࢀߟʹ͍ͯͯ͠ • PromiseΛฦ͢ • Google/Promises • https://github.com/google/promises • ಛ௃ • ίΞ͕Objective-CͰॻ͔Ε͍ͯΔ • SwiftͰ΋΋ͪΖΜ࢖͍΍͍͢ ϥΠϒϥϦ͸ίϧʔνϯͰ͸ͳ͘εϨουʹΑΓॲཧΛ࠶։ͨ͠Γఀࢭ͢Δ let asyncFunc = async({ _ -> Int in let loggedUser = try await(loginUser(username, pass)) let followersList = try await(getFollowers(loggedUser)) let countUnfollowed = try await(unfollow(followersList)) return countUnfollowed }).then({ value in print("Unfollowed \(value) users") })

Slide 105

Slide 105 text

ࠓ೔ͷ࿩ͷ·ͱΊ • ଞͷݴޠͷasync/awaitͱͷҧ͍ • Φʔόʔϔουͷগͳ͍ܰྔͳίϧʔνϯΛ໨ࢦ͍ͯ͠Δ • await࣌ͷϝιουνΣʔϯʹΑΔ࢖͍উखͷྑ͞ • ίϧʔνϯAPIΛఏڙ͠ɺࣗલͰFutureΛ࡞ͬͨΓɺΫϩʔδϟͰͷϋϯυϥܕͷ ؔ਺΋async/awaitͷϥούʔΛ࡞Δ͜ͱ͕Ͱ͖Δ • ଞͷݴޠͷasync/awaitͱͷڞ௨఺ • εςʔτϚγϯͷࣗಈੜ੒ʹΑΔίϧʔνϯΛಋೖ͠Α͏ͱ͍ͯ͠Δ

Slide 106

Slide 106 text

Ҏ্Ͱ͢ ౤ථ͍͚ͯͨͩ͠Δͱ ࣍ͷػձʹ ʮ3Y4XJGUͱBTZODBXBJUʯ ͷ࿩Λ͢ΔϞνϕʔγϣϯʹͳΓ·͢ʂ ΑΖ͓͘͠ئ͍͠·͢

Slide 107

Slide 107 text

ࢀߟ΁ͷϦϯΫ

Slide 108

Slide 108 text

ࢀߟ: C# IUUQCMPHYJOMFOFUFOUSZ ඇಉظϝιουೖ໳ (7) - ಺෦࣮૷Λ೷͘

Slide 109

Slide 109 text

ࢀߟ: Kotlin IUUQTTQFBLFSEFDLDPNTZTZBHJLPUMJOLPSVUJOXPMJKJFTJZPV IUUQTXXXZPVUVCFDPNXBUDI WE3*+Y*H4;K: ,PUMJO$PSPVUJOFTXJUI,PUMJOCZ)BEJ)BSJSJ Kotlin ίϧʔνϯΛཧղ͠Α͏

Slide 110

Slide 110 text

SILʢSwift Intermediate Languageʣʹ ίϧʔνϯ͕͢Ͱʹ͋Δʁ IUUQTHJUIVCDPNBQQMFTXJGUCMPCNBTUFSEPDT4*-STUDPSPVUJOFUZQFT