基本上我连接到使用标识的pharo服务器。然后我使用Znclient来获取myserver / json文件,其中包含key和value的集合。如何在不耗尽内存的情况下每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
答案 0 :(得分:2)
您可以创建一个完成工作的循环并等待40秒:
process := [ [ self shouldStillRun ] whileTrue: [
self fetchDataAndDoWork.
40 seconds asDelay wait. ] ]
forkAt: Processor userBackgroundPriority
named: '<processName>'.
上面我假设shouldStillRun
和fetchDataAndDoWork
是包含这些代码的类中的方法。如果您想在 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
对象以查看您获得的内容。
答案 1 :(得分:1)
我的意思是使用块do:every:类TaskScheduler。这会起作用吗?
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