Avatar
@discardableResult func task<Success>(operation: @escaping @Sendable () async -> Success) -> Task<Success, Never> { return Task.init(operation: operation) } @discardableResult func taskDetached<Success>(operation: @escaping @Sendable () async -> Success) -> Task<Success, Never> { return Task.detached(operation: operation) } func dispatchQueueMainAsync(execute work: @escaping () -> Void) { DispatchQueue.main.async(execute: work) } func dispatchQueueGlobalAsync(execute work: @escaping () -> Void) { DispatchQueue.global().async(execute: work) } func dispatchQueueMainAsyncSendable(execute work: @escaping @Sendable () -> Void) { DispatchQueue.main.async(execute: work) } func dispatchQueueGlobalAsyncSendable(execute work: @escaping @Sendable () -> Void) { DispatchQueue.global().async(execute: work) } と定義しておいて
11:22 PM
@MainActor をつけたクラスのメソッドから↓を実行 print("#0", Thread.current, Thread.current == Thread.main) Task { print("#1a", Thread.current, Thread.current == Thread.main) Task { print("#1b", Thread.current, Thread.current == Thread.main) } } task { print("#2a", Thread.current, Thread.current == Thread.main) Task { print("#2b", Thread.current, Thread.current == Thread.main) } } Task.detached { print("#3a", Thread.current, Thread.current == Thread.main) Task { print("#3b", Thread.current, Thread.current == Thread.main) } } taskDetached { print("#4a", Thread.current, Thread.current == Thread.main) Task { print("#4b", Thread.current, Thread.current == Thread.main) } } DispatchQueue.main.async { print("#5a", Thread.current, Thread.current == Thread.main) Task { print("#5b", Thread.current, Thread.current == Thread.main) } } dispatchQueueMainAsync { print("#6a", Thread.current, Thread.current == Thread.main) Task { print("#6b", Thread.current, Thread.current == Thread.main) } } DispatchQueue.global().async { print("#7a", Thread.current, Thread.current == Thread.main) Task { print("#7b", Thread.current, Thread.current == Thread.main) } } dispatchQueueGlobalAsync { print("#8a", Thread.current, Thread.current == Thread.main) Task { print("#8b", Thread.current, Thread.current == Thread.main) } } dispatchQueueMainAsyncSendable { print("#9a", Thread.current, Thread.current == Thread.main) Task { print("#9b", Thread.current, Thread.current == Thread.main) } } dispatchQueueGlobalAsyncSendable { print("#10a", Thread.current, Thread.current == Thread.main) Task { print("#10b", Thread.current, Thread.current == Thread.main) } }
11:23 PM
結果 #0 <_NSMainThread: 0x600002fb4140>{number = 1, name = main} true #1a <_NSMainThread: 0x600002fb4140>{number = 1, name = main} true #1b <_NSMainThread: 0x600002fb4140>{number = 1, name = main} true #2a <NSThread: 0x600002f82180>{number = 6, name = (null)} false #2b <NSThread: 0x600002f82180>{number = 6, name = (null)} false #3a <NSThread: 0x600002f82540>{number = 2, name = (null)} false #3b <NSThread: 0x600002f82540>{number = 2, name = (null)} false #4a <NSThread: 0x600002f82540>{number = 2, name = (null)} false #4b <NSThread: 0x600002f82540>{number = 2, name = (null)} false #5a <_NSMainThread: 0x600002fb4140>{number = 1, name = main} true #5b <_NSMainThread: 0x600002fb4140>{number = 1, name = main} true #6a <_NSMainThread: 0x600002fb4140>{number = 1, name = main} true #6b <_NSMainThread: 0x600002fb4140>{number = 1, name = main} true #7a <NSThread: 0x600002f82780>{number = 4, name = (null)} false #7b <_NSMainThread: 0x600002fb4140>{number = 1, name = main} true #8a <NSThread: 0x600002f82180>{number = 6, name = (null)} false #8b <_NSMainThread: 0x600002fb4140>{number = 1, name = main} true #9a <_NSMainThread: 0x600002fb4140>{number = 1, name = main} true #9b <NSThread: 0x600002f82540>{number = 2, name = (null)} false #10a <NSThread: 0x600002f82180>{number = 6, name = (null)} false #10b <NSThread: 0x600002f82180>{number = 6, name = (null)} false
11:24 PM
@Sendable のクロージャー内だと、クロージャーの外側のactor contextが引き継がれないってこと?