構造体


Task


非同期作業の単位。


iOS 13.0+ iPadOS 13.0+ Mac Catalyst 13.0+ macOS 10.15+

tvOS 13.0+ visionOS 1.0+ watchOS 6.0+

@frozen
  struct Task<Success, Failure> where Success : Sendable, Failure : Error





概観


Task のインスタンスを作成する際は、そのタスクが実行する処理を含むクロージャを提供して下さい。タスクは作成後すぐに実行を開始できます。明示的に開始またはスケジュールする必要はありません。タスクを作成したら、そのインスタンスを使用してタスクを操作します。たとえば、タスクの完了を待機したり、キャンセルしたりできます。タスクの完了を待機またはキャンセルせずにタスクへの参照を破棄することは、プログラミング エラーにはなりません。タスクは、参照を保持しているかどうかに関係なく実行されます。ただし、タスクへの参照を破棄すると、そのタスクの結果を待機したり、タスクをキャンセルしたりする機能が放棄されます。


現在のタスク(独立したタスクまたは子タスクのいずれか)に対する操作をサポートするために、Task は yield() などのクラスメソッドも公開しています。これらのメソッドは非同期であるため、常に既存のタスクの一部として呼び出されます。


タスクの一部として実行されているコードのみが、そのタスクを操作できます。現在のタスクを操作するには、Task の静的メソッドのいずれかを呼び出して下さい。


タスクの実行は、タスクが実行された一連の期間と見なすことができます。各期間は、一時停止ポイントまたはタスクの完了時に終了します。これらの実行期間は、PartialAsyncTask のインスタンスによって表されます。カスタムで実行を実装しない限り、部分タスクを直接操作することはありません。


Task がその一部である言語レベルの同時実行モデルの詳細については、Swift プログラミング言語 の 同時実行 を参照してください。



タスクのキャンセル


タスクにはキャンセルを示す共通のメカニズムが含まれていますが、キャンセルの処理方法に関する共通の実装はありません。タスクで実行している作業に応じて、その作業を停止する正しい方法は異なります。同様に、停止が適切であればいつでも、タスクの一部として実行されているコードはキャンセルの有無を確認する責任があります。複数の部分を含む長いタスクでは、複数の時点でキャンセルの有無を確認し、各時点で異なる方法でキャンセルを処理する必要があります。作業を停止するためにエラーを throw するだけでよい場合は、Task.checkCancellation() 関数を呼び出してキャンセルの有無を確認します。キャンセルに対するその他の応答としては、そこまで完了した作業を返す、空の結果を返す、nil を返すなどがあります。


キャンセルは純粋なブール値であり、キャンセルの理由などの追加情報を含めることはできません。これは、タスクが様々な理由でキャンセルでき、キャンセルプロセス中に追加の理由が発生する可能性があることを反映しています。



タスククロージャの有効期間


タスクは、与えられたタスクによって実行されるコードを含むクロージャを渡すことで初期化されます。


このコードが完了まで実行され、タスクが完了し、失敗または結果値が返されると、このクロージャは即時解放されます。


タスクオブジェクトを保持しても、クロージャは無期限に保持されるわけではありません。タスクが保持する参照は、タスク完了後に解放されるためです。したがって、タスクが値への弱い参照をキャプチャする必要はほとんどありません。


たとえば、以下のコードスニペットでは、タスクが完了するとアクターの参照が解放され、タスクとそれを保持しているアクターの間の循環参照が切断されるため、アクターを weak としてキャプチャする必要はありません。


struct Work: Sendable {}

actor Worker {
    var work: Task<Void, Never>?
    var result: Work?

    deinit {
        // even though the task is still retained,
        // once it completes it no longer causes a reference cycle with the actor

        print("deinit actor")
    }

    func start() {
        work = Task {
            print("start task work")
            try? await Task.sleep(for: .seconds(3))
            self.result = Work() // we captured self
            print("completed task work")
            // but as the task completes, this reference is released
        }
        // we keep a strong reference to the task
    }
}

これを以下のように使用します:


await Worker().start()

actor (アクター) は start() メソッドの self の使用によってのみ保持され、start メソッドは非構造化 Task の終了を待たずに即座に返すことに注意してください。タスクが完了し、そのクロージャが破棄されると、アクターへの強い参照も解放され、アクターは期待どおりに deinitialize (初期化解除) できるようになります。


したがって、上記の呼び出しは常に以下の出力になります。


start task work
completed task work
deinit actor




トピックス


タスクの作成


static var currentPriority: TaskPriority

現在のタスクの優先度。


static var basePriority: TaskPriority?

現在のタスクの基本優先度。


func withTaskPriorityEscalationHandler<T, E>(operation: () async throws(E) -> T, onPriorityEscalated: (TaskPriority, TaskPriority) -> Void, isolation: isolated (any Actor)?) async throws(E) -> T

タスク優先度拡大ハンドラを登録しながら、渡された operation を実行します。現在が優先度拡大の対象である場合、ハンドラは現在のタスクと同時に実行されます。

  Beta  



結果へのアクセス


var value: Success

throw するタスクが完了した後の結果。


var value: Success

throw しないタスクが完了した後の結果。


var result: Result<Success, Failure>

throw するタスクが完了した後の結果またはエラー。



タスクのキャンセル


struct CancellationError

タスクがキャンセルされたことを示すエラー。


func cancel()

このタスクをキャンセルします。


var isCancelled: Bool

タスクの実行を停止すべきかどうかを示すブール値。


static var isCancelled: Bool

タスクの実行を停止すべきかどうかを示すブール値。


static func checkCancellation() throws

タスクがキャンセルされた場合エラーを throw します。


func withTaskCancellationHandler<T>(handler: () -> Void, operation: () async throws -> T) async rethrows -> T

  廃止  


func withTaskCancellationHandler<T>(operation: () async throws -> T, onCancel: () -> Void, isolation: isolated (any Actor)?) async rethrows -> T

現在のタスクがキャンセルされた場合に直ちに呼び出されるキャンセルハンドラを使用して操作を実行します。



実行の一時停止


static func yield() async

現在のタスクを一時停止し、他のタスクの実行を許可します。


static func sleep(nanoseconds: UInt64) async throws

現在のタスクを少なくともナノ秒単位で与えられた期間中断します。


static func sleep<C>(for: C.Instant.Duration, tolerance: C.Instant.Duration?, clock: C) async throws

与えられた期間、現在のタスクを中断します。


static func sleep<C>(until: C.Instant, tolerance: C.Instant.Duration?, clock: C) async throws

許容範囲内で与えられた期限まで現在のタスクを一時停止します。



タスクの比較


static func == (Task<Success, Failure>, Task<Success, Failure>) -> Bool

2 つの値が等しいかどうかを示すブール値を返します。


static func != (Self, Self) -> Bool

2 つの値が等しくないかどうかを示すブール値を返します。


var hashValue: Int

ハッシュ値です。


func hash(into: inout Hasher)

この値の必須コンポーネントを与えられたハッシュ関数に入力してハッシュします。



廃止


typealias Group   廃止  


typealias Handle   廃止  


typealias Priority   廃止  


static func CancellationError() -> CancellationError   廃止  


func getResult() async -> Result<Success, Failure>   廃止  


func get() async throws -> Success   廃止  


static func sleep(UInt64) async   廃止  


static func suspend() async   廃止  


static func withCancellationHandler<T>(handler: () -> Void, operation: () async throws -> T) async rethrows -> T   廃止  



イニシャライザー


init(name: String?, executorPreference: (any TaskExecutor)?, priority: TaskPriority?, operation: sending () async throws -> Success)

与えられた throw する操作を、新しい 非構造化 のトップレベルタスクの一部として非同期的に実行します。


init(name: String?, executorPreference: (any TaskExecutor)?, priority: TaskPriority?, operation: sending () async -> Success)

与えられた throw しない操作を、新しい 非構造化 トップレベルタスクの一部として非同期的に実行します。


init(name: String?, priority: TaskPriority?, operation: sending () async -> Success)

与えられた throw しない操作を、新しい 非構造化 トップレベルタスクの一部として非同期的に実行します。


init(name: String?, priority: TaskPriority?, operation: sending () async throws -> Success)

与えられた throw する操作を、新しい 非構造化 のトップレベルタスクの一部として非同期的に実行します。



インスタンスメソッド


func escalatePriority(to: TaskPriority)

このタスクのタスク priority (優先度) を手動で newPriority に拡大します。   Beta  


func get() async -> Success   廃止  



型プロパティ


static var name: String?

タスクの作成中に設定されている場合、現在のタスクの人間が読める名前を返します。

  Beta  



型メソッド


static func detached(name: String?, executorPreference: (any TaskExecutor)?, priority: TaskPriority?, operation: sending () async throws -> Success) -> Task<Success, any Error>

与えられた throw する操作を、新しい 非構造化の分離された トップレベルタスクの一部として非同期的に実行します。


static func detached(name: String?, executorPreference: (any TaskExecutor)?, priority: TaskPriority?, operation: sending () async -> Success) -> Task<Success, Never>

与えられた throw しない操作を、新しい 非構造化の分離された トップレベルタスクの一部として非同期的に実行します。


static func detached(name: String?, priority: TaskPriority?, operation: sending () async throws -> Success) -> Task<Success, any Error>

与えられた throw する操作を、新しい 非構造化の分離された トップレベルタスクの一部として非同期的に実行します。


static func detached(name: String?, priority: TaskPriority?, operation: sending () async -> Success) -> Task<Success, Never>

与えられた throw しない操作を、新しい 非構造化の分離された トップレベルタスクの一部として非同期的に実行します。


static func immediate(name: String?, priority: TaskPriority?, operation: sending () async -> Success) -> Task<Success, Never>

呼び出しスレッド/タスクのコンテキストで新しいタスクを作成し、すぐに実行を開始します。

  Beta  


static func immediate(name: String?, priority: TaskPriority?, operation: sending () async throws -> Success) -> Task<Success, any Error>

呼び出しスレッド/タスクのコンテキストで新しいタスクを作成し、すぐに実行を開始します。

  Beta  


static func runDetached(priority: TaskPriority?, operation: () async throws -> Success) -> Task<Success, any Error>

廃止されました。ソース互換性の理由からのみ利用可能です。

  廃止  


static func runDetached(priority: TaskPriority?, operation: () async -> Success) -> Task<Success, Never>

廃止されました。ソース互換性の理由からのみ利用可能です。

  廃止  


static func withGroup<TaskResult, BodyResult>(resultType: TaskResult.Type, returning: BodyResult.Type, body: (inout Task<Success, Failure>.Group<TaskResult>) async throws -> BodyResult) async rethrows -> BodyResult

  廃止  



デフォルトの実装


Equatable の実装


Hashable の実装





関連


以下に準拠


Copyable

Success が Copyable に準拠し, Success が Escapable に準拠し, Success が Sendable に準拠し, Failure が Error に準拠している場合準拠します。


Equatable

Success が Copyable に準拠し, Success が Escapable に準拠し, Success が Sendable に準拠し, Failure が Error に準拠している場合準拠します。


Hashable

Success が Copyable に準拠し, Success が Escapable に準拠し, Success が Sendable に準拠し, Failure が Error に準拠している場合準拠します。


Sendable

SendableMetatype



以下も見よ


タスク


struct TaskGroup

動的に作成された子タスクを含むグループ。


func withTaskGroup<ChildTaskResult, GroupResult>(of: ChildTaskResult.Type, returning: GroupResult.Type, isolation: isolated (any Actor)?, body: (inout TaskGroup<ChildTaskResult>) async -> GroupResult) async -> GroupResult

動的な数の子タスクを含めることができる新しいスコープを開始します。




@@@@@@@@@@@@@@
9/12ここまで
@@@@@@@@@@@@@@


struct ThrowingTaskGroup

Throw し、動的に作成された子タスクを含むグループ。


func withThrowingTaskGroup<ChildTaskResult, GroupResult>(of: ChildTaskResult.Type, returning: GroupResult.Type, isolation: isolated (any Actor)?, body: (inout ThrowingTaskGroup<ChildTaskResult, any Error>) async throws -> GroupResult) async rethrows -> GroupResult

動的な数の throw する子タスクを含めることができる新しいスコープを開始します。


struct TaskPriority

タスクの優先度。


struct DiscardingTaskGroup

動的に作成された子タスクを含む破棄するグループ。


func withDiscardingTaskGroup<GroupResult>(returning: GroupResult.Type, isolation: isolated (any Actor)?, body: (inout DiscardingTaskGroup) async -> GroupResult) async -> GroupResult

動的な数の子タスクを含めることができる新しいスコープを開始します。


struct ThrowingDiscardingTaskGroup

動的に作成された子タスクを含む throw する破棄のグループ。


func withThrowingDiscardingTaskGroup<GroupResult>(returning: GroupResult.Type, isolation: isolated (any Actor)?, body: (inout ThrowingDiscardingTaskGroup<any Error>) async throws -> GroupResult) async throws -> GroupResult

動的な数の子タスクを含めることができる新しいスコープを開始します。


struct UnsafeCurrentTask

現在のタスクへの安全でない参照。














トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ