Share
Embed
Transcript
32 slides
-
4XJGUόʔδϣϯૣݟද όʔδϣϯ ਪ͠ػೳ DPODVSSFODZҎ֎ 9DPEF EBUF J04 "EE3FTVMUUPUIF4UBOEBSE-JCSBSZ
1SPQFSUZ8SBQQFST ,FZ1BUI&YQSFTTJPOTBT'VODUJPOT .VMUJQMF5SBJMJOH$MPTVSFT 3FTVMU#VJMEFST &YUFOEJOH4UBUJD.FNCFS-PPLVQJO(FOFSJD$POUFYUT *OUSPEVDFFYJTUFOUJBMABOZA *NQMJDJUMZ0QFOFE&YJTUFOUJBMT 🤔 7BMVFBOE5ZQF1BSBNFUFS1BDLT 🤔 5ZQFEUISPXT "MMPXUSBJMJOHDPNNBJODPNNBTFQBSBUFEMJTUT 🤔 -
"TZODBXBJU ABTZODA ABXBJUAΛಋೖ let newURL = await server.redirectURL(for: url) let
(data, response) = try await session.dataTask(with: newURL) -
4USJDUDPODVSSFODZGPSHMPCBMWBSJBCMFT άϩʔόϧมͷฒߦ҆શੑΛอূ (MPCBM$PODVSSFODZ final class NonSendable { var age: Int
= 0 static let shared = NonSendable() // Error: Static property 'shared' is not concurrency- safe because non-'Sendable' type 'NonSendable' may have shared mutable state } let global = NonSendable() // Error: Let 'global' is not concurrency-safe because non-'Sendable' type 'NonSendable' may have shared mutable state -
@MainActor final class NonSendable { var age: Int = 0
static let shared = NonSendable() } let global = NonSendable() w A!.BJO"DUPSA࠷ߴ -
%ZOBNJDBDUPSJTPMBUJPOFOGPSDFNFOUGSPNOPOTUSJDUDPODVSSFODZ DPOUFYUT ࣮ߦ࣌ʹJTPMBUJPOΛ֬ೝ͢Δ %ZOBNJD"DUPS*TPMBUJPO protocol ViewDelegateProtocol { // MainActor ࢦఆ͕ͳ͍ʂ
func respondToUIEvent() } @MainActor class MyViewController: @preconcurrency ViewDelegateProtocol // @preconcurrency Λ͚ΔͱແཧΓ४ڌͰ͖Δɻ { func respondToUIEvent() { // ࣮ߦ࣌ʹ MainActor ͔Βདྷ͔ͨͲ͏͔ࣗಈͰνΣοΫ͢Δ } } -
6TBCJMJUZPGHMPCBMBDUPSJTPMBUFEUZQFT (MPCBMBDUPSؔ࿈Ͱ͍͕͢͞Ξοϓ (MPCBM"DUPS*TPMBUFE5ZQFT6TBCJMJUZ w 4UPSFEQSPQFSUJFTPG4FOEBCMFUZQFJOBHMPCBMBDUPSJTPMBUFEWBMVFUZQFDBOCF EFDMBSFEBTOPOJTPMBUFEXJUIPVUVTJOH VOTBGF w 4UPSFEQSPQFSUJFTPG4FOEBCMFUZQFJOBHMPCBMBDUPSJTPMBUFEWBMVFUZQFBSFUSFBUFE
BTOPOJTPMBUFEXIFOVTFEXJUIJOUIFNPEVMFUIBUEF fi OFTUIFQSPQFSUZ w !4FOEBCMFJTJOGFSSFEGPSHMPCBMBDUPSJTPMBUFEGVODUJPOTBOEDMPTVSFT w (MPCBMBDUPSJTPMBUFEDMPTVSFTBSFBMMPXFEUPDBQUVSFOPO4FOEBCMFWBMVFTEFTQJUF CFJOH!4FOEBCMF w "HMPCBMBDUPSJTPMBUFETVCDMBTTPGBOPOJTPMBUFE OPO4FOEBCMFDMBTTJTBMMPXFE CVUJUNVTUCFOPO4FOEBCMF -
ͦΕ·Ͱ func fire(process: @escaping @MainActor @Sendable () -> Void) {
Task { await process() } } άϩʔόϧΞΫλʔͳ͕ؔࣗಈͰ4FOEBCMFʹͳͬͨ ͦΕ͔Β func fire(process: @escaping @MainActor () -> Void) { Task { await process() } } -
$POUSPMEFGBVMUBDUPSJTPMBUJPOJOGFSFODF σϑΥϧτΛ!.BJO"DUPSʹͰ͖Δ 4XJGU w A!.BJO"DUPSA࠷ߴ // @MainActor final class NonSendable
{ var age: Int = 0 static let shared = NonSendable() } let global = NonSendable() -
(MPCBMBDUPSJTPMBUFEDPOGPSNBODFT (MPCBM"DUPSݶఆͰDPOGPSNͰ͖Δ 4XJGU @MainActor class MyModelType: @MainActor Equatable { var
name: String init(name: String) { self.name = name } static func ==(lhs: MyModelType, rhs: MyModelType) -> Bool { lhs.name == rhs.name } } w ͜ΕϚδͰ͍͠ͱࢥ͍·͢ɻ -
%FGBVMUBDUPSJTPMBUJPOQFS fi MF ϑΝΠϧ୯ҐͰ!.BJO"DUPSʹͰ͖Δ %SBGU using @MainActor final class NonSendable
{ var age: Int = 0 static let shared = NonSendable() } let global = NonSendable() w A!.BJO"DUPSA࠷ߴ -
*TPMBUJPO ͦͷؔͲ͜Ͱ࣮ߦ͞ΕΔ͔ͦͷͲ͜ʹډΔ͔ w 4XJGU͔Β͋Δ֓೦ w ؔͷछྨOPOJTPMBUFE HMPCBMBDUPSJTPMBUFE !.BJO"DUPS BDUPS JTPMBUFE
w ͷछྨEJTDPOOFDUFE UBTLJTPMBUFE HMPCBMBDUPSJTPMBUFE BDUPS JTPMBUFE -
OPOJTPMBUFEGVODͷJTPMBUJPO @MainActor func main() async { await action() } nonisolated
func action() async { // ͜͜ main executor Ͱ͢ } w ݪॳҾ͖ܧ͍Ͱ͍ͨ -
$MBSJGZUIF&YFDVUJPOPG/PO"DUPS*TPMBUFE"TZOD'VODUJPOT OPOJTPMBUFEHMPCBMFYFDVUPSͰΔ @MainActor func main() async { await action() }
nonisolated func action() async { // ͜͜ main executor Ͱ͋Γ·ͤΜ } w BDUPSͷෛՙΛಀͨ͢Ί -
4FOEBCMFͷνΣοΫ͕ਐΜͩ OPOTQFDJ fi DQSPQPTBM final class Foo { func run()
async {} } actor MyActor { func main() async { let foo = Foo() await foo.run() // Error: passing argument of non-sendable type 'Foo' outside of actor-isolated context may introduce data races } } w ͳΜͱίϨ͕μϝ w AGPPA͕ӽڥ͍ͯ͠ΔͨΊ -
3FHJPO#BTFE*TPMBUJPO EJTDPOOFDUFEͳΒӽڥͰ͖Δ final class Foo { func run() async {}
} actor MyActor { func main() async { let foo = Foo() await foo.run() } } w AGPPA͕EJTDPOOFDUFE -
ͦ͏͘ͳ͍ final class Foo { func run() async {} }
actor MyActor { let foo = Foo() func main() async { await foo.run() // sending 'self.foo' risks causing data races } } w AGPPA͕BDUPSJTPMBUFE -
*OIFSJUBODFPGBDUPSJTPMBUJPO "DUPSΛҾ͖ܧ͙ࢦఆ͕Ͱ͖Δ final class Foo { func run(isolation: isolated (any
Actor)? = #isolation) async {} } actor MyActor { let foo = Foo() func main() async { await foo.run() } } -
3VOOPOJTPMBUFEBTZODGVODUJPOTPOUIFDBMMFSTBDUPSCZEFGBVMU ཉ͔ͬͨͭ͠ 4XJGU final class Foo { nonisolated(nonsending) func run()
async {} } actor MyActor { let foo = Foo() func main() async { await foo.run() } } w AOPOJTPMBUFE OPOTFOEJOH AΛ͚ͭΕʮҾ͖ܧ͙ʯ -
/POJTPMBUFE/POTFOEJOH#Z%FGBVMU final class Foo { func run() async {} }
actor MyActor { let foo = Foo() func main() async { await foo.run() } } w GFBUVSF fl BHͰࢦఆলུɻ