Claris FileMaker 2023 で新しくスクリプトステップが追加されました。
「コールバックを使用してサーバー上のスクリプト実行」というスクリプトステップです。
概要
新しい「コールバックを使用してサーバー上のスクリプト実行」スクリプトステップは、「サーバー上のスクリプト実行」スクリプトステップで実行されたスクリプトが終わった時に任意のスクリプトを実行する機能です。
これまでも、「サーバー上のスクリプト実行」スクリプトステップの「終了するまで待つ」オプションをオンにすれば同様のことはできるにはできましたが、新しい「コールバックを使用してサーバー上のスクリプト実行」スクリプトステップでは「終了するまで待つ」必要がないので処理を並列化することができます。
スクリプトの実行順
新しい「コールバックを使用してサーバー上のスクリプト実行」スクリプトステップは、登場するスクリプトが最低でも 3 つあります。
- 呼び出し元のスクリプト
- サーバー上のスクリプト実行(終了を待たない)で呼び出されるスクリプト
- コールバックに設定したスクリプト
これらのスクリプトの実行順を調べてみました。
呼び出し元スクリプトが「コールバックを使用してサーバー上のスクリプト実行」を実行
⬇
サーバ上実行のスクリプト(終了をまたない)。実行開始を伝えるだけなので一瞬
⬇
すぐに呼び出し元スクリプトに戻る
⬇
呼び出し元のスクリプトが終わった
⬇
サーバ上実行のスクリプトが終わったらコールバックスクリプトが実行される
図にしてみました
いろいろ試してみた
ケース 1
呼び出し元スクリプトよりもサーバー上実行のスクリプトが早く終わった
結果 : 「サーバー上実行のスクリプト」が「呼び出し元スクリプト」よりも先に終わった場合は、「呼び出し元スクリプト」が終わらないとコールバックスクリプトは実行されない
ケース 2
呼び出し元スクリプトに「コールバックを使用してサーバー上のスクリプト実行」スクリプトステップを複数設置
結果 : 早く終わったほうのサーバー上実行のコールバックスクリプトから実行される
ケース 3
呼び出し元スクリプトで「コールバックを使用してサーバー上のスクリプト実行」を実行して、呼び出し元のスクリプトのサブスクリプトからも「コールバックを使用してサーバー上のスクリプト実行」を実行した場合
結果 : 呼び出し元スクリプトかサブスクリプトかは関係なく、早く終わった方のサーバー上実行のスクリプトのコールバックスクリプトから実行される
ケース 4
「コールバックを使用してサーバー上のスクリプト実行」で呼び出されたサーバー上実行のスクリプト内で「コールバックを使用してサーバー上のスクリプト実行」を実行
結果 : 状況的には「サーバー上のスクリプト実行」で呼び出したスクリプトが「サーバー上のスクリプト実行」を実行することになるので、エラー 3 が出る
ケース 5
「コールバックを使用してサーバー上のスクリプト実行」で実行されたコールバックスクリプト内で「コールバックを使用してサーバー上のスクリプト実行」を実行
結果 : 呼び出し元が呼び出したサーバー上実行のスクリプトが終了したらコールバックスクリプトが実行され、そのコールバックスクリプトが呼び出したサーバー上実行のスクリプトが実行される。そのサーバー上実行のスクリプトが終了したらコールバックスクリプトが呼び出したコールバックスクリプトが実行される
最後の方はかなりカオスな状態になってきました。
いずれにせよスクリプトの実行順は気にする必要がありそうです。
Claris FileMaker Go の場合は?
FileMaker Go は、FileMaker Pro とコールバックの動きが異なる場合があります。
それは、コールバックスクリプトを実行する局面で FileMaker Go がバックグラウンドにあった場合です。
結論から言うと、FileMaker Go がバックグラウンドの状態だとコールバックスクリプトは実行されません。
FileMaker Go がフォアグラウンドになったタイミングで(サーバー上実行のスクリプトが終了していたら)コールバックスクリプトは実行されます。
そのため、処理を開始だけして他のアプリを開いていて、処理が終わったら他のアプリを開いていても通知が来るようにする、というような理想的な非同期的な使い方は FileMaker Go の標準機能だけで実現するのは難しそうです。
そもそもバックグラウンドで処理を一時停止するのは iOS の基本仕様だと思いますので、FileMaker Go の機能向上でどうにかなるようなことではないとも言えます。
使用例
やはり、時間がかかる処理をする際に「コールバックを使用してサーバー上のスクリプト実行」を使うのがスタンダードな使い方のように思います。
これまでは「サーバー上のスクリプト実行」で終了するまで待たないにした場合、終了したことがわかるようにするためには自前で仕組みを作る必要がありました。
今回追加された「コールバックを使用してサーバー上のスクリプト実行」の最大の利点は、終了するまで待たない「サーバー上のスクリプト実行」で処理が終了したことがかんたんに確認できることでしょうか。
注意点
「コールバックを使用してサーバー上のスクリプト実行」スクリプトステップを使用する場合に、いくつか注意点があります。
- 「コールバックを使用してサーバー上のスクリプト実行」で設定されたスクリプトの結果は、呼び出し元スクリプトで Get ( スクリプトの結果 ) 関数を使用しても使えません
- コールバックスクリプトにスクリプト引数を設定することはできますが、「コールバックを使用してサーバー上のスクリプト実行」のスクリプトの結果を受け取るには Get ( スクリプトの結果 ) 関数を使用します。Get ( スクリプト引数 ) ではありません。
- コールバックに設定したスクリプトが実行されるのは呼び出し元スクリプトが終わった後です。割り込んで実行されません
- 「コールバックを使用してサーバー上のスクリプト実行」で呼び出されたサーバー上実行のスクリプト内で「サーバー上のスクリプト実行」と「コールバックを使用してサーバー上のスクリプト実行」は使用できません。
【 余談 】
最近下記リンク先への流入増大したいこともあり、
流入量が多いとブログの価値が高まりますます投稿を加速していきたいと思います。
リンク先を開いていただけると大変助かります。
Claris International Inc. (日本語)
ご協力いただけましたら幸いです。