Slide 1

Slide 1 text

6QEBUJOHBO"QQUP6TF4XJGU$PODVSSFODZ ղઆ

Slide 2

Slide 2 text

ΞϓϦͷ֓ཁ

Slide 3

Slide 3 text

"QQҰཡ 5PQ %SJOL-JTU $PNQMJDBUJPO

Slide 4

Slide 4 text

5PQ %SJOL-JTU )FBMUI,JU

Slide 5

Slide 5 text

ΞϓϦ मਖ਼લ ͷߏ଄

Slide 6

Slide 6 text

$POUFOU7JFX $PGGFF5SBDLFS7JFX %SJOL-JTU7JFX %SJOL %SJOL5ZQF $PGGFF%BUB )FBMUI,JU$POUSPMMFS &OUJUZ 0CTFSWBCMF0CKFDU 7JFX $POUSPMMFS

Slide 7

Slide 7 text

&OUJUZ struct Drink: Hashable, Codable { let mgCaffeine: Double let date: Date let uuid: UUID } enum DrinkType: Int, CaseIterable, Identifiable { case smallCoffee case mediumCoffee case largeCoffee case singleEspresso case doubleEspresso case quadEspresso case blackTea case greenTea case softDrink case energyDrink case chocolate } %SJOL %SJOL5ZQF

Slide 8

Slide 8 text

7JFX $PGGFF5SBDLFS7JFX %SJOL-JTU7JFX

Slide 9

Slide 9 text

7JFX$PGGFF%BUB 0CTFSWBCMF0CKFDU $PGGFF5SBDLFS7JFX %SJOL-JTU7JFX @EnvironmentObject var coffeeData: CoffeeData coffeeData.currentMGCaffeineString coffeeData.totalCupsTodayString coffeeData.addDrink(…)

Slide 10

Slide 10 text

$PGGFF%BUB class CoffeeData: ObservableObject { lazy var healthKitController = HealthKitController(withModel: self) // @Published ͳͷͰϝΠϯεϨου͔Βૢ࡞͢Δඞཁ͕͋Δ @Published public var currentDrinks: [Drink] = [] // … func save() { /* currentDrinks ΛσΟεΫ΁อଘ(όοΫάϥ΢ϯυॲཧ) */ } func load() { /* currentDrinks ΛσΟεΫ͔ΒಡΈࠐΈ(όοΫάϥ΢ϯυॲཧ) */ } }

Slide 11

Slide 11 text

)FBMUI,JU$POUSPMMFS // … runs the query on an anonymous background queue. private let store = HKHealthStore() class HealthKitController { private weak var model: CoffeeData? // … public func loadNewDataFromHealthKit(…) { /* … */ } public func save(drink: Drink) { /* … */ } private func updateModel(newDrinks: [Drink], deletedDrinks: Set) { // … // @Published ͳͷͰϝΠϯεϨου͔Βૢ࡞͢Δඞཁ͕͋Δ model?.currentDrinks = drinks } }

Slide 12

Slide 12 text

$PGGFF5SBDLFS7JFX $PGGFF%BUB )FBMUI,JU$POUSPMMFS %SJOL-JTU7JFX .BJO5ISFBE #BDLHSPVOE5ISFBE DVSSFOU%SJOLT NPEFMDVSSFOU%SJOLTESJOLT ),)FBMUI4UPSF TUPSFFYFDVUF RVFSZ SFTVMUT)BOEMFS %FWJDF 3FBE8SJUF%BUB BEE%SJOL

Slide 13

Slide 13 text

4XJGU$PODVSSFODZҠߦͷํ਑

Slide 14

Slide 14 text

$PGGFF5SBDLFS7JFX $PGGFF%BUB )FBMUI,JU$POUSPMMFS %SJOL-JTU7JFX .BJO5ISFBE #BDLHSPVOE5ISFBE DVSSFOU%SJOLT ),)FBMUI4UPSF TUPSFFYFDVUF RVFSZ SFTVMUT)BOEMFS %FWJDF 3FBE8SJUF%BUB BEE%SJOL ͜͜Λ੔ཧ͍ͨ͠ NPEFMDVSSFOU%SJOLTESJOLT

Slide 15

Slide 15 text

$PGGFF5SBDLFS7JFX $PGGFF%BUB )FBMUI,JU$POUSPMMFS %SJOL-JTU7JFX .BJO5ISFBE #BDLHSPVOE5ISFBE DVSSFOU%SJOLT ),)FBMUI4UPSF TUPSFFYFDVUF RVFSZ SFTVMUT)BOEMFS %FWJDF 3FBE8SJUF%BUB BEE%SJOL ௚઀ଞͷΦϒδΣΫτͷϓϩύςΟΛ ߋ৽͢ΔͷͰ͸ͳ͘ɺBDUPSؒͷ ΍ΓͱΓʹஔ͖׵͑Δඞཁ͕͋Δ NPEFMDVSSFOU%SJOLTESJOLT

Slide 16

Slide 16 text

$PGGFF5SBDLFS7JFX $PGGFF%BUB )FBMUI,JU$POUSPMMFS %SJOL-JTU7JFX .BJO"DUPS "DUPS DVSSFOU%SJOLT ),)FBMUI4UPSF %FWJDF 3FBE8SJUF%BUB BEE%SJOL $PGGFF%BUB4UPSF VQEBUF.PEFM OFX%SJOLTEFMFUFE%SJOLT ౜ಥʹ׬੒ਤ

Slide 17

Slide 17 text

੔ཧ͞Ε֤ͨΞΫλʔͷ໾ׂ

Slide 18

Slide 18 text

$PGGFF%BUB @MainActor class CoffeeData: ObservableObject { lazy var healthKitController = HealthKitController(withModel: self) private let store = CoffeeDataStore() @Published public private(set) var currentDrinks: [Drink] = [] // … } currentDrinks ͸ private(set) ʹͳΓ CoffeeData ಺ͰͷΈߋ৽͞ΕΔΑ͏ʹ ৽ͨʹఆٛͨ͠ CoffeeDataStore ͸ϓϩύςΟͱͯ͠อ͍࣋ͯ͠Δ HealthKitController ͱͷؔ܎ੑ͸มΘΒͣ

Slide 19

Slide 19 text

$PGGFF%BUB4UPSF actor CoffeeDataStore { func save(_ currentDrinks: [Drink]) { /* currentDrinks ΛσΟεΫ΁อଘ */ } func load() -> [Drink] { /* currentDrinks ΛσΟεΫ͔ΒಡΈࠐΈ */ } // … } ෼཭લͷؔ਺͸ͦΕͧΕ save(), load() save ʹ͸Ҿ਺͕ɺload ʹ͸ฦΓ஋͕෇͍ͨ ΞΫλʔؒͰඞཁͳ৘ใΛ΍ΓͱΓ͢ΔͨΊͷΠϯλʔϑΣʔε

Slide 20

Slide 20 text

)FBMUI,JU$POUSPMMFS actor HealthKitController { private weak var model: CoffeeData? func loadNewDataFromHealthKit() async -> Bool { // … let (samples, deletedSamples, newAnchor) = try await queryHealthKit() // … await model?.updateModel(newDrinks: newDrinks, deletedDrinks: deletedDrinks) // … } // … } CoffeeData ͱͷؔ܎ੑ͸มΘΒͣ ௚઀ currentDrink Λߋ৽͢ΔͷͰ͸ͳ͘ɺupdateModel Λհͯ͠ߋ৽͢Δ ΫΤϦͷ࣮ߦ෦෼ͷهड़͕ΦγϟϨʹ

Slide 21

Slide 21 text

$PGGFF5SBDLFS7JFX $PGGFF%BUB )FBMUI,JU$POUSPMMFS %SJOL-JTU7JFX .BJO"DUPS "DUPS DVSSFOU%SJOLT ),)FBMUI4UPSF %FWJDF 3FBE8SJUF%BUB BEE%SJOL $PGGFF%BUB4UPSF VQEBUF.PEFM OFX%SJOLTEFMFUFE%SJOLT ࠶ܝ