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

iOSで画像の任意の場所をぼかし処理する方法

1 はじめに1.1 前提条件2 準備3 実装3.1 ぼかし処理のイメージ画像3.2 サンプルコード4 さいごに はじめに iOSで写真の任意の場所にぼかし処理をしたいケースがありましたので、 iOSで ...

swift

【Swift】Xcode10.3でSwift5で書かれたプロジェクトでデリゲートが呼ばれない

1 はじめに2 起きた環境3 起きる条件3.1 コード上の条件3.2 ビルド時の条件4 再現4.1 テスト用コード5 対応策6 さいごに7 おすすめ書籍 はじめに こんにちはsuzukiです。Xcod ...

[Swift]AlertControllerでメモリリークが起きた!便利なMemory Graph

1 はじめに2 今回の問題2.1 deinitの調査2.2 原因の調査3 解決策4 Memory Graphについて5 さいごに6 おすすめ書籍 はじめに こんにちは、suzukiです。この記事の結論 ...

SwiftUIでChartライブラリを使ってみた。

1 はじめに2 Chartsライブラリについて2.1 ライブラリの導入3 wrapper structの作成3.1 描画のための準備3.2 データの取得と更新3.3 コード全体4 さいごに5 おすすめ ...

swift

[Swift]ObjectMapperで簡単にJSONを読み込む

1 はじめに2 準備3 実装3.1 基本的な使い方3.2 ネスト配列に対応してみよう4 さいごに はじめに こんにちは、onukiです。 私はSwiftでJSONを取り扱う際に、 ObjectMapp ...

フォロー

blog-page_side_responsive

2021年11月
 123456
78910111213
14151617181920
21222324252627
282930  

アプリ情報

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