0

基本上我使用识别连接到带有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
4

2 回答 2

2

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

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

上面我假设shouldStillRunfetchDataAndDoWork是包含这些代码的类中的方法。如果您想在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每次调用的所有返回值,就不会出现内存问题。

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

于 2018-01-15T07:40:41.690 回答
1

我的意思是使用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

于 2018-01-15T12:18:00.407 回答