$PSF%BUBͷεϨουҧͱ w /4.BOBHFE0CKFDUɺ/4.BOBHFE0CKFDU$POUFYU ͦΕΛੜͨ͠εϨουͷ֎͔ΒΞΫηε͢ΔͱεϨουҧɻ w σʔλͷෆ߹ΫϥογϡΛҾ͖ى͜͢ɻ w ͜ΕΒͷΦϒδΣΫτΛੜͨ͠εϨουͷ֎ʹ࣋ͪग़͞ͳ͍͜ͱ Λ"QQMFͷυΩϡϝϯτٻΊ͍ͯΔɻ 15 "QQMF%FWFMPQFS%PDVNFOUBUJPOʰ/4.BOBHFE0CKFDU$POUFYUʱΑΓ
$PSF%BUBͷεϨουҧͱ w /4.BOBHFE0CKFDUɺ/4.BOBHFE0CKFDU$POUFYU ͦΕΛੜͨ͠εϨουͷ֎͔ΒΞΫηε͢ΔͱεϨουҧɻ w σʔλͷෆ߹ΫϥογϡΛҾ͖ى͜͢ɻ w ͜ΕΒͷΦϒδΣΫτΛੜͨ͠εϨουͷ֎ʹ࣋ͪग़͞ͳ͍͜ͱ Λ"QQMFͷυΩϡϝϯτٻΊ͍ͯΔɻ w "DUPSεϨουͷಉҰੑΛอূ͠ͳ͍ɻ w .BOBHFE0CKFDU͕ੜεϨουͷ֎ʹ࣋ͪग़͞Εͯ͠·͏ɻ 22
w /4.BOBHFE0CKFDUͷ͔ΘΓʹ/4.BOBHFE0CKFDU*%ΛϓϩύςΟ ͱͯ͠อ࣋͢Δɻ w /4.BOBHFE0CKFDU*%ʹܕใ͕ͳ͍ɻ w .BOBHFEPCKFDUʹΞΫηε͢ΔʹGFUDIͤͶͳΒͳ͍ɻ 28 4XJGU$PODVSSFODZͰ.BOBHFE0CKFDUΛ҆શʹอ͍࣋ͨ͠ʂ εϨουҧΛ͙ैདྷख๏
ඞཁͳੑ࣭ 4XJGU$PODVSSFODZʹ͓͍ͯ.BOBHFE0CKFDUΛ҆શʹϓϩύςΟͱ ͯ͠อ࣋ɺड͚͢͠Δʹɺ.BOBHFE0CKFDUͱ.BOBHFE 0CKFDU$POUFYUʢ.0$ʣ͕࣍ͷੑ࣭Λຬͨ͢ඞཁ͕͋Δɻ w 4FOEBCMFͰ͋Δɻ w .BOBHFE0CKFDUൃߦݩͷ.0$ͱಉ͡εϨουͰΞΫηε͞ΕΔɻ 30
ඞཁͳੑ࣭ 4XJGU$PODVSSFODZʹ͓͍ͯ.BOBHFE0CKFDUΛ҆શʹϓϩύςΟͱ ͯ͠อ࣋ɺड͚͢͠Δʹɺ.BOBHFE0CKFDUͱ.BOBHFE 0CKFDU$POUFYUʢ.0$ʣ͕࣍ͷੑ࣭Λຬͨ͢ඞཁ͕͋Δɻ w 4FOEBCMFͰ͋Δɻ w .BOBHFE0CKFDUൃߦݩͷ.0$ͱಉ͡εϨουͰΞΫηε͞ΕΔɻ 31
4FOEBCMFͱʁ w σʔλڝ߹͕ൃੜͤͣ҆શʹड͚͠Ͱ͖ΔܕΛද͢ϓϩτίϧɻ w ͲͷBDUPSDPOUFYU͔ΒΞΫηεͯ҆͠શɻ w ྫ͑ɺܕ4FOEBCMFɻ w ड͚࣌͠ʹίϐʔ͞ΕΔ͔Βɻ w /4.BOBHFE0CKFDU/4.BOBHFE0CKFDU$POUFYU 4FOEBCMFͰͳ͍ɻ w ҟͳΔBDUPSDPOUFYU͔ΒΞΫηε͍͚ͯ͠ͳ͍ɻ 33
ඞཁͳੑ࣭ 4XJGU$PODVSSFODZʹ͓͍ͯ.BOBHFE0CKFDUΛ҆શʹϓϩύςΟͱ ͯ͠อ࣋ɺड͚͢͠Δʹɺ.BOBHFE0CKFDUͱ.BOBHFE 0CKFDU$POUFYUʢ.0$ʣ͕࣍ͷੑ࣭Λຬͨ͢ඞཁ͕͋Δɻ w 4FOEBCMFͰ͋Δɻ w .BOBHFE0CKFDUൃߦݩͷ.0$ͱಉ͡εϨουͰΞΫηε͞ΕΔɻ 34
ඞཁͳੑ࣭ 4XJGU$PODVSSFODZʹ͓͍ͯ.BOBHFE0CKFDUΛ҆શʹϓϩύςΟͱ ͯ͠อ࣋ɺड͚͢͠Δʹɺ.BOBHFE0CKFDUͱ.BOBHFE 0CKFDU$POUFYUʢ.0$ʣ͕࣍ͷੑ࣭Λຬͨ͢ඞཁ͕͋Δɻ w 4FOEBCMFͰ͋Δɻ w (MPCBMBDUPSΛܕʹద༻͢Δɻ w .BOBHFE0CKFDUൃߦݩͷ.0$ͱಉ͡εϨουͰΞΫηε͞ΕΔɻ 35
(MPCBMBDUPSͱʁ w ϓϩύςΟͷಉظΞΫηεΛಛఆͷBDUPSDPOUFYUʹ੍ݶ͢Δɻ w ྫʣ.BJO"DUPSΛద༻ͨ͠ϓϩύςΟɺ.BJO"DUPS͔ΒͷΈ ಉظΞΫηεͰ͖Δɻ w /PO4FOEBCMFͳܕʹHMPCBMBDUPSΛద༻͢Δͱɺ4FOEBCMFͳܕ ͱͯ͠ѻ͏͜ͱ͕Ͱ͖Δɻ w (MPCBMBDUPSʹΑͬͯσʔλڝ߹͕ൃੜ͠ͳ͍͜ͱ͕อূ͞ΕΔ͔Βɻ 36 @MainActor var mainActorIsolatedValue: Int?
(MPCBMBDUPSΛఆٛ͢Δ w .BOBHFE0CKFDU.0$Λ4FOEBCMFʹ͢ΔͨΊʹ HMPCBMBDUPSΛఆٛ͢Δɻ w (MPCBMBDUPSͱͯ͠ɺ$PSF%BUB"DUPSΛఆٛ͢Δɻ w 6*ͷӨڹΛ͙ͨΊɺ.BJO"DUPSΘͳ͍ɻ 37 @globalActor public actor CoreDataActor { public static let shared = CoreDataActor() }
.BOBHFE0CKFDUʹHMPCBMBDUPSΛద༻ w .BOBHFE0CKFDUͷܕʢ$PSF%BUB&OUJUZʣʹ$PSF%BUB"DUPSΛ ద༻͢Δɻ w ܕͷఆٛʹ!$PSF%BUB"DUPSΛ͚ͭΔ͚ͩɻ w ͜ΕͰ.BOBHFE0CKFDUΛ4FOEBCMFͳͷͱͯ͠ѻ͑Δɻ 38 @objc(CoreDataEntity) @CoreDataActor public class CoreDataEntity: NSManagedObject {}
ඞཁͳੑ࣭ 4XJGU$PODVSSFODZʹ͓͍ͯ.BOBHFE0CKFDUΛ҆શʹϓϩύςΟͱ ͯ͠อ࣋ɺड͚͢͠Δʹɺ.BOBHFE0CKFDUͱ.BOBHFE 0CKFDU$POUFYUʢ.0$ʣ͕࣍ͷੑ࣭Λຬͨ͢ඞཁ͕͋Δɻ w 4FOEBCMFͰ͋Δɻ w (MPCBMBDUPSΛܕʹద༻͢Δɻ w .BOBHFE0CKFDUൃߦݩͷ.0$ͱಉ͡εϨουͰΞΫηε͞ΕΔɻ 40
ඞཁͳੑ࣭ 4XJGU$PODVSSFODZʹ͓͍ͯ.BOBHFE0CKFDUΛ҆શʹϓϩύςΟͱ ͯ͠อ࣋ɺड͚͢͠Δʹɺ.BOBHFE0CKFDUͱ.BOBHFE 0CKFDU$POUFYUʢ.0$ʣ͕࣍ͷੑ࣭Λຬͨ͢ඞཁ͕͋Δɻ w 4FOEBCMFͰ͋Δɻ w (MPCBMBDUPSΛܕʹద༻͢Δɻ w .BOBHFE0CKFDUൃߦݩͷ.0$ͱಉ͡εϨουͰΞΫηε͞ΕΔɻ 41
ඞཁͳੑ࣭ 4XJGU$PODVSSFODZʹ͓͍ͯ.BOBHFE0CKFDUΛ҆શʹϓϩύςΟͱ ͯ͠อ࣋ɺड͚͢͠Δʹɺ.BOBHFE0CKFDUͱ.BOBHFE 0CKFDU$POUFYUʢ.0$ʣ͕࣍ͷੑ࣭Λຬͨ͢ඞཁ͕͋Δɻ w 4FOEBCMFͰ͋Δɻ w (MPCBMBDUPSΛܕʹద༻͢Δɻ w .BOBHFE0CKFDUൃߦݩͷ.0$ͱಉ͡εϨουͰΞΫηε͞ΕΔɻ w $VTUPN"DUPS&YFDVUPSΛར༻͢Δɻ 42
"DUPSͷ࣮ߦڥ 44 actor MyActor { … } w "DUPSɺσʔλڝ߹͕ൃੜ͠ͳ͍͜ͱΛอূ͢Δɻ w ಉظతʹ࣮ߦ͢Δ໋ྩͷ·ͱ·ΓͰ͋Δʮ+PCʯΛҰ࣮ͭͣͭߦɻ w ʮ+PCʯΛͲͷΑ͏ʹ࣮ߦ͢Δ͔ఆٛ͞Ε͍ͯͳ͍ɻ w σϑΥϧτͰɺ4XJGUϥϯλΠϜ͕+PCͷ࣮ߦڥΛఏڙ͢Δɻ w +PC͕࣮ߦ͞ΕΔεϨουࣗମຖճมΘΔՄೳੑ͕͋Δɻ
w "DUPSͷʮ+PCΛͲ͏࣮ߦ͢Δͷ͔ʯΛΧελϚΠζͰ͖Δɻ w +PCΛ࣮ߦ͢Δ&YFDVUPSΛ࣮͢Δɻ w VOPXOFE&YFDVUPSͱͯ͠ɺ+PCΛ࣮ߦ͢Δ&YFDVUPSΛొ͢Δɻ 45 actor MyActor { nonisolated var unownedExecutor: UnownedSerialExecutor { ... } }
ͲΜͳ&YFDVUPSΛ࣮͖͔͢ w /4.BOBHFE0CKFDU$POUFYUQFSGPSNͰॲཧΛߦ͍͍ͨɻ w NBOBHFEPCKFDUDPOUFYUΛอ࣋͢Δɻ w NBOBHFEPCKFDUDPOUFYUͷQFSGPSNͰ+PCΛશ࣮ͯߦ͢Δɻ w 4IBSFEΠϯελϯε͕ඞཁɻ w (MPCBMBDUPSʹొ͢Δɻ 46
(MPCBMBDUPSʹ&YFDVUPSΛొ w $PSF%BUB"DUPSͷVOPXOFE&YFDVUPSͱͯ͠ɺ $PSF%BUB&YFDVUPSͷTIBSFEΠϯελϯεΛฦ͢Α͏ʹ͢Δɻ w $PSF%BUB"DUPSʹର͢Δૢ࡞ͯ͢ɺ$PSF%BUB&YFDVUPS͕ཧ ͢Δ.0$ͷQFSGPSNؔͰ࣮ߦ͞ΕΔΑ͏ʹͳͬͨɻ 53 extension CoreDataActor { public nonisolated var unownedExecutor: UnownedSerialExecutor { CoreDataExecutor.sharedUnownedExecutor } }
͜͜·Ͱͷ·ͱΊ .BOBHFE0CKFDUͱ.0$ʹରͯ͠ҎԼͷ͜ͱΛߦͳͬͨɻ w 4FOEBCMFʹ͢Δɻ w .BOBHFE0CKFDUʜ(MPCBMBDUPSΛܕʹద༻͢Δɻ w .0$ʜ(MPCBMBDUPSΛద༻ͨ͠ϥούΛ࣮ɻ w (MPCBMBDUPSͷ+PCͷ࣮ߦΛ੍ݶɻ w $VTUPN"DUPS&YFDVUPSΛར༻͢Δɻ w &YFDVUPSͷڞ௨.0$ͷQFSGPSNؔͰͯ͢ͷ+PCΛ࣮ߦɻ 54
͜͜·Ͱͷ·ͱΊ .BOBHFE0CKFDUͱ.0$ʹରͯ͠ҎԼͷ͜ͱΛߦͳͬͨɻ w 4FOEBCMFʹ͢Δɻ w .BOBHFE0CKFDUʜ(MPCBMBDUPSΛܕʹద༻͢Δɻ w .0$ʜ(MPCBMBDUPSΛద༻ͨ͠ϥούΛ࣮ɻ w (MPCBMBDUPSͷ+PCͷ࣮ߦΛ੍ݶɻ w $VTUPN"DUPS&YFDVUPSΛར༻͢Δɻ w &YFDVUPSͷڞ௨.0$ͷQFSGPSNؔͰͯ͢ͷ+PCΛ࣮ߦɻ 55
͜͜·Ͱͷ·ͱΊ .BOBHFE0CKFDUͱ.0$ʹରͯ͠ҎԼͷ͜ͱΛߦͳͬͨɻ w 4FOEBCMFʹ͢Δɻ w .BOBHFE0CKFDUʜ(MPCBMBDUPSΛܕʹద༻͢Δɻ w .0$ʜ(MPCBMBDUPSΛద༻ͨ͠ϥούΛ࣮ɻ w (MPCBMBDUPSͷ+PCͷ࣮ߦΛ੍ݶɻ w $VTUPN"DUPS&YFDVUPSΛར༻͢Δɻ w &YFDVUPSͷڞ௨.0$ͷQFSGPSNؔͰͯ͢ͷ+PCΛ࣮ߦɻ 56
·ͱΊ w NBOBHFEPCKFDUͱNBOBHFEPCKFDUDPOUFYUΛɺHMPCBMBDUPS Λ༻͍ͯεϨουηʔϑʹ͢Δ͜ͱΛࢼΈͨɻ w $VTUPNBDUPSFYFDVUPSΛར༻͢Δ͜ͱͰɺ࣮ߦεϨουͷಉҰ ੑΛ࣮ݱͰ͖Δɻ w $36%ૢ࡞ʹ͍ͭͯɺBDUPSڥք͔Βશͯಉظతʹૢ࡞͕Մೳͳ ҰํͰɺBDUPSڥք֎͔ΒඇಉظΞΫηεΛཁٻͰ͖ͨɻ 70