Как я могу сделать что-то, когда runloop событие сделано, обработав?

У меня есть некоторая обработка в моем приложении Какао, которое иногда заканчивает тем, что звонило через иерархию данных, чтобы сделать набор работы как результат события. Каждая маленькая часть создает и уничтожает некоторые ресурсы. Я не хочу те ресурсы в большую часть времени, но я хотел бы найти умный способ создать их перед всей работой и уничтожить их в конце.

За исключением создания тех буферов, и т.д. доступных глобально от "родителя" или в другом месте, там способ знать локально в некотором коде, когда выполненный цикл событий закончился? Затем я мог создать их, если они не там и сохраняют их до концов цикла выполнения, снова используя их для каких-либо последующих вызовов перед тем временем.

Править: Я не ищу предложения о том, как реструктурировать мой код, который я могу сделать так или иначе. Эта проблема просто подняла вопрос для меня того, как знать, когда runloop сделан. Если бы я писал в, я не знаю, JavaScript, я использовал бы a setTimeout с нулем для выполнения очистки события конца. Я предполагаю, что NSTimer с интервалом нуля мог бы выполнить это также, но задающийся вопросом, существует ли что-то инструмент для очистки.

Спасибо.

1
задан Ben Zotto 12 June 2010 в 22:57
поделиться

2 ответа

Поскольку вы сказали «Какао» и «NSRunLoop», я предполагаю, что вы используете Mac OS X. Пока вы используете Snow Leopard, вы можете использовать Grand Central Dispatch для очень элегантного решения такого рода проблем. .

Если на Leopard или новее (или iPhone, если на то пошло), вы можете использовать NSOperations, чтобы сделать то же самое (с немного большим количеством кода).

Все это обсуждается в Руководстве по программированию с параллелизмом .

Даже если ваш алгоритм не предназначен для выполнения вне основного потока - вне основного цикла событий - вы все равно можете решить проблему планирования вещей для «позже», которые будут выполняться последовательно, через основная очередь.

2
ответ дан 2 September 2019 в 23:48
поделиться

Я относительно новичок в программировании в Какао, но разве это не может быть легко выполнено с помощью переменной уровня класса с получателем для этой переменной?

Скажем, ваш код выглядит так, в псевдокоде:

bool completed = false;

void chi
  if completed = false
    create foo;
    create bar;

   completed = true 
  end if

  while looping
     ...
  loop

  completed = false;
  destroy foo
  destroy bar

А в других частях вашей программы проверьте значение 'завершено', чтобы узнать, были ли созданы указанные объекты?

РЕДАКТИРОВАТЬ: Я просто перечитал ваш вопрос и отредактировал его соответствующим образом. . Если это многопоточное приложение, вам также необходимо убедиться, что ваши объекты являются потокобезопасными.

0
ответ дан 2 September 2019 в 23:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: