iOS

[Swift5.5]actorで非同期のデータ競合を回避しよう!

投稿日:2021年11月8日 更新日:

はじめに

Swift5.5にて非同期に関する追加が行われ、async/awaitについては以前の記事で紹介しましたが、今回は同じく非同期で活躍するactorについて触れたいと思います。

以前の記事はこちらから。
Swift5.5での非同期処理async/awaitの追加

actor

actorはSwiftコンパイラーにて、actorに伴う制限を静的に適用し、可変データへの同時アクセスを防ぐことができます。それでは実際に使用しながら見ていきたいと思います。

上記のようにactorを作成してみました、実際にコードで呼んでみると

このように値の変更が不可であるnameは何も制約を付けずとも呼び出せるのですが、値の変更が可能なnumberはそのままではエラーになってしまいます。エラーを発生させずにnumberにアクセスするには以下のように非同期でアクセスしなければなりません。

このようにactorを用いることで、データ競合が起こりうる可能性があるパラメータや、それに伴うメソッドを管理することで、整合性を保とうというわけです。

というわけで、actorにはメソッドも追加できます。

メソッドも同じく、非同期で呼び出さないとコンパイラでエラーが表示されます。

ただそこに気をつければ使用方法は他のasyncメソッドと変わりないです。

どのような動きをするかサンプルを作成しました。

上記の処理を実行すると以下のログが出力されます。

a,b,cをawaitする前にnumberを出力しているので一旦初期値の0が表示されることを確認できると思います。

actorを使用する際の注意

actorを使用することにより、データの競合が発生する確率を下げれるとは思いますが、データの同期などは自分で行わなくてはなりません。例えば以下のように別スレッドで処理を実行した場合、

どちらのスレッドから開始されるかはわからないため、出力させる値が0なのか1なのかわからないです。処理やデータの構造がこのような形で問題ない作りならば良いですが、スレッドが複雑に動き出した時に予期しないケースが発生することもあります。その際はデータの同期の仕組みを考えたり等、現在の作りと変わらないことは、頭に入れておいたほうが良いと思います。

さいごに

actorを使用することにより、非同期で使用する前提のデータ構造や、それらを操作するメソッドを作成できるので、使用者がコンパイラエラーで同期的に使用するのを防げたり、第三者がコードをみた際もわかりやすくなると思うので、async/awaitを使用する際はactorはセットが必須かなと思いました。

おすすめ書籍

[改訂新版]Swift実践入門 ── 直感的な文法と安全性を兼ね備えた言語 WEB+DB PRESS plus 詳解 Swift 第4版 [改訂新版]Swiftポケットリファレンス (POCKET REFERENCE)

blog-page_footer_336




blog-page_footer_336




-iOS
-,

執筆者:

免責事項

このブログは、記事上部に記載のある投稿日時点の一般的な情報を提供するものであり、投資等の勧誘・法的・税務上の助言を提供するものではありません。仮想通貨の投資・損益計算は複雑であり、個々の取引状況や法律の変更によって異なる可能性があります。ブログに記載された情報は参考程度のものであり、特定の状況に基づいた行動の決定には専門家の助言を求めることをお勧めします。当ブログの情報に基づいた行動に関連して生じた損失やリスクについて、筆者は責任を負いかねます。最新の法律や税務情報を確認し、必要に応じて専門家に相談することをお勧めします。


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


関連記事

swift

[Swift3] SwitchとEnumを使ってSectionやCellを指定する

1 はじめに1.1 環境2 Enumの用意3 Tableの用意4 Cellの返却にEnumを使用する5 さいごに はじめに どうも、はじめです。 今回はSectionやCellの指定にSwitchとE ...

[Swift]プロトコルの拡張で既定値を設定する。

1 はじめに2 プロトコルの拡張について2.1 プロトコルに既定値を設定2.2 プロトコルを設定したクラスの作成2.3 制約をつけてプロトコルに既定値を設定3 さいごに4 おすすめ書籍 はじめに こん ...

swift

SwiftでTTTAttributedLabelの文字列からリンク表示

1 はじめに2 TTTAttributedLabelとは3 CocoaPodsでインストール4 実装4.1 Labelの表示4.2 タップの検知5 さいごに はじめに こんにちは。 はじめましてnuk ...

【Swift】MemoryLeakの簡単な確認方法

1 はじめに2 テストの準備3 開発中のテスト4 テストコードの作成5 さいごに6 おすすめ書籍 はじめに こんにちは、suzukiです。前回の記事で循環参照について触れました。今回は問題の発見に役立 ...

[Swift]iOSの脱獄チェックを行う。

1 はじめに2 脱獄とは3 脱獄のチェックについて3.1 Cydiaのチェック3.2 パスのチェック3.3 書き込み権限のチェック3.4 iOSシミュレーターのチェックを行わない。4 コードまとめ5 ...

フォロー

blog-page_side_responsive

2021年11月
 123456
78910111213
14151617181920
21222324252627
282930  

アプリ情報

私たちは無料アプリもリリースしています、ぜひご覧ください。 下記のアイコンから無料でダウンロードできます。