Как я могу обновить JSON-файл на определенный период в pharo

В основном я подключился к серверу с pharo, используя идентификацию. Затем я использовал Znclient, чтобы получить файл myserver/json, который содержит коллекцию ключей и значений. Как я могу обновлять этот файл Json каждые 40 секунд, не исчерпывая память, и Как я могу выполнить итерацию по нему, чтобы собрать определенный ключ?

Это то, что я сделал до сих пор

"                         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

2 ответа

Решение

Вы можете создать цикл, который выполняет работу и ждет 40 секунд:

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

Выше я предполагаю, что shouldStillRun а также fetchDataAndDoWork являются методами в классе, содержащем этот код. Если вы хотите поиграть с этим кодом на игровой площадке, замените их на несколько пользовательских фрагментов кода. Например:

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 объект, чтобы увидеть, что вы получите обратно.

Я имел в виду использование блока 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

Другие вопросы по тегам