TObjectList にバインドされた Delphi LiveBinding を使用する UI フォームで開発しているシステムには、共通のイディオムがあります。フロントエンドは、TRESTRequest.ExecuteAsync() を使用して REST サーバーへの非同期メソッド呼び出しを使用する Delphi です。INSERT/UPDATE/DELETE アクティビティについては、BindSourceAdapter.OnListInsert/OnListDelete/etc イベント ハンドラーで残りの呼び出しを実行するコードを配置しています。
私が抱えているこの問題は、これらのイベント ハンドラーが、同期呼び出しでのみ認識できる応答を期待しているように見えることです。たとえば、OnListDelete の実装者は、項目が ObjectList から削除されたかどうかを示す "ADeleted" を設定しています。
以下のコード例では、問題を処理する正しい方法がわからないため、現時点では手を振っています。ただし、「DeleteConnector」には、リソースを変更するための呼び出しを行うための非同期呼び出しが含まれており、応答を受信する前に戻ります。メイン スレッドでは PDQ を返しますが、DB の制約などにより削除が失敗する場合があります。
バインドされた UI リストをバックエンドの状態と同期させる適切な方法は何ですか?
procedure TCNSConnectorFrame.ConnectorListOnDelete
(Sender: TBindSourceAdapter; AIndex: Integer;
var AHandled, ADeleted: Boolean);
begin
AHandled := true;
ADeleted := true;
DeleteConnector;
end;
POST/PUT/DELETE 呼び出しをブロッキング呼び出しに切り替えることでパントできます。LiveBinding 以外の実装に切り替えることでパントできるため、UI の状態をよりきめ細かく制御できます。
そのような行動をとる前に、基本的なことを見落としていないことを確認したいと思います. 私はマルチスレッドコーディングにかなり慣れていません。
ここで初めての質問ですが、長い間潜んでいました。ティア。