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 + Alamofire4 + Unbox2.4を使ってJSONをパースする

1 はじめに1.1 前提条件1.2 完成形2 モデルの作成3 APIクラスの作成4 ViewControllerの作成4.1 Delegateの指定4.2 TableViewの設定4.3 Search ...

【Swift】SwiftUIの理解のためDSL記法とFunctionBuilderを調べてみた

1 はじめに2 DSL(ドメイン固有言語)について3 関数ビルダ3.1 定義方法3.2 使用方法3.3 SwiftUIの関数ビルダ4 カスタム属性5 さいごに6 おすすめ書籍 はじめに Xcode11 ...

swift

[Swift]Schemaを使用してURLの接続先を切り替える

1 はじめに2 XCodeのBuildConfigurationとは3 スキーマとは4 スキーマの追加方法5 スキーマの設定変更6 開発と本番で異なる通信の接続先を設定する7 さいごに はじめに はじ ...

swift

[Swift]UIPageViewControllerを使ってみよう!

1 はじめに1.1 前提条件2 UIPageViewControllerとは3 実装3.1 ViewControllerを準備3.2 UIPageViewControllerを準備3.3 最初の画面を ...

swift

[Swift]動画撮影にて好きなサイズでプレビュー表示する

1 はじめに1.1 前提条件2 実装3 さいごに はじめに こんにちは、nukkyです。 今回はメインのビューの右上とかに小窓の様なプレビューにカメラの映像を出して、動画撮影するという機能を作成したの ...

フォロー

blog-page_side_responsive

2021年11月
 123456
78910111213
14151617181920
21222324252627
282930  

アプリ情報

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