我已经构建了后端(使用WebBroker)并且它有一些API.所以在客户端我将使用REST组件来获取json并解析它.这是一个例子:
procedure TForm1.ButtonCreateClick(Sender: TObject);
begin
//rreqTodoCreate is a TRESTRequest component!
rreqTodoCreate.Params[0].Value := EditTitle.Text;
rreqTodoCreate.Params[1].Value := EditCategory.Text;
rreqTodoCreate.ExecuteAsync(procedure
begin
ResponseEdit.Text := rrespToDo.Content;
end);
end;
Run Code Online (Sandbox Code Playgroud)
我正在使用ExecuteAsyncdocwiki建议,因为我在移动设备上,我不希望UI冻结!我已经读过,它ExecuteAsync运行在一个单独的线程上,所以我有一个疑问.
我编写的代码是否是线程安全的?或换句话说:当我更新主窗体中组件的文本时,我应该使用队列还是同步?
根据TRESTRequest.ExecuteAsync()文件:
参数
此方法定义以下参数:
ACompletionHandler- 指定在完成请求执行后要运行的匿名方法.ASynchronized- 当为True时,指定ACompletionHandler在主线程上下文中运行的方法集.当为False时,ACompletionHandler在执行线程上下文中运行.AFreeThread- 如果为True,则在完成请求执行后释放执行线程.
该ASynchronized参数True默认为:
function ExecuteAsync(
ACompletionHandler: TCompletionHandler = nil;
ASynchronized: Boolean = True; // <--
AFreeThread: Boolean = True;
ACompletionHandlerWithError: TCompletionHandlerWithError = nil): TRESTExecutionThread;
Run Code Online (Sandbox Code Playgroud)
因此,您显示的代码完全没问题,分配ResponseEdit.Text是线程安全的.