我在使用绑定到 TObjectList 的 Delphi LiveBindings 的 UI 表单上开发的系统中有一个常见的习惯用法。前端是 Delphi 使用异步方法调用使用 TRESTRequest.ExecuteAsync() 的 REST 服务器。对于 INSERT/UPDATE/DELETE 活动,我将代码放在 BindSourceAdapter.OnListInsert/OnListDelete/etc 事件处理程序中执行其余调用。
我遇到的这个问题是,那些事件处理程序似乎期望只有通过同步调用才能知道的响应。例如,OnListDelete 让实现者设置“ADeleted”以指示该项目是否已从 ObjectList 中删除。
在下面的代码示例中,我现在正在解决这个问题,因为我不知道处理它的正确方法。但是“DeleteConnector”包含异步调用以调用 mod 资源并在收到响应之前返回。在主线程中,它返回 PDQ,但删除可能会因为数据库约束而失败,例如。
使绑定的 UI 列表与后端状态保持同步的正确方法是什么?
procedure TCNSConnectorFrame.ConnectorListOnDelete
(Sender: TBindSourceAdapter; AIndex: Integer;
var AHandled, ADeleted: Boolean);
begin
AHandled := true;
ADeleted := true;
DeleteConnector;
end;
我可以通过将 POST/PUT/DELETE 调用切换为阻塞调用来下注。我可以通过切换到非 LiveBindings 实现来实现对 UI 状态的更精细控制。
在我采取这样的行动之前,我想确保我没有忽略一些基本的东西。我对多线程编码相当陌生。
这里的第一个问题,但潜伏了很长时间。TIA。