如何在 pharo 中刷新某个时间段的 JSON 文件

How can I refresh a JSON file for a certain period in pharo

基本上我使用标识连接到带有 pharo 的服务器。然后我使用 Znclient 获取包含键和值集合的 myserver/json 文件。我如何才能每 40 秒刷新一次此 Json 文件而不会 运行 内存不足以及我如何遍历它以收集特定的密钥?

这是我目前所做的

"                         Login                          "
"********************************************************"
|a data|
a := ZnClient new.
a get: 'https://MyServer'.
a
headerAt: 'referer' put: 'MyServer';
formAt: 'email' add: 'myEmail';
formAt: 'password' add: 'myPassword'.

a post.
a get: 'MyServer/json'.

"                   get Json file      "
"*******************************************************
data := NeoJSONReader fromString: a contents

您可以创建一个循环来完成工作并等待 40 秒:

process := [ [ self shouldStillRun ] whileTrue: [ 
      self fetchDataAndDoWork.
      40 seconds asDelay wait. ] ]
   forkAt: Processor userBackgroundPriority
   named: '<processName>'.

以上我假设 shouldStillRunfetchDataAndDoWork 是包含这些代码的 class 中的方法。如果您想在 Playground 中使用此代码,请将它们替换为一些自定义代码片段。例如:

shouldStillRun := true.
process := [ [ shouldStillRun ] whileTrue: [ 
      | data |
      '<create the client>'
      data := NeoJSONReader fromString: a contents.
      40 seconds asDelay wait. ] ]
   forkAt: Processor userBackgroundPriority
   named: '<processName>'.

只要您不在每次调用时存储所有 data return,您就不会有内存问题。

如果您的数据表示一个字典,那么 NeoJSON 将 return 一个字典对象,您可以只使用 at: 消息来获取值。您可以检查 data 对象以查看返回的内容。

我的意思是使用 class TaskScheduler 的块 do: every: 。那也行吗?

scheduler := TaskScheduler new.
scheduler start.
"refresh every 40 seconds"
scheduler
   do: [a get: 'https://MyServer/json'.
        Transcript show: 'Refreshing......'; cr.
        data := NeoJSONReader fromString: a contents; cr.
   every: 60 seconds