У меня есть некоторая обработка в моем приложении Какао, которое иногда заканчивает тем, что звонило через иерархию данных, чтобы сделать набор работы как результат события. Каждая маленькая часть создает и уничтожает некоторые ресурсы. Я не хочу те ресурсы в большую часть времени, но я хотел бы найти умный способ создать их перед всей работой и уничтожить их в конце.
За исключением создания тех буферов, и т.д. доступных глобально от "родителя" или в другом месте, там способ знать локально в некотором коде, когда выполненный цикл событий закончился? Затем я мог создать их, если они не там и сохраняют их до концов цикла выполнения, снова используя их для каких-либо последующих вызовов перед тем временем.
Править: Я не ищу предложения о том, как реструктурировать мой код, который я могу сделать так или иначе. Эта проблема просто подняла вопрос для меня того, как знать, когда runloop сделан. Если бы я писал в, я не знаю, JavaScript, я использовал бы a setTimeout
с нулем для выполнения очистки события конца. Я предполагаю, что NSTimer с интервалом нуля мог бы выполнить это также, но задающийся вопросом, существует ли что-то инструмент для очистки.
Спасибо.
Поскольку вы сказали «Какао» и «NSRunLoop», я предполагаю, что вы используете Mac OS X. Пока вы используете Snow Leopard, вы можете использовать Grand Central Dispatch для очень элегантного решения такого рода проблем. .
Если на Leopard или новее (или iPhone, если на то пошло), вы можете использовать NSOperations, чтобы сделать то же самое (с немного большим количеством кода).
Все это обсуждается в Руководстве по программированию с параллелизмом .
Даже если ваш алгоритм не предназначен для выполнения вне основного потока - вне основного цикла событий - вы все равно можете решить проблему планирования вещей для «позже», которые будут выполняться последовательно, через основная очередь.
Я относительно новичок в программировании в Какао, но разве это не может быть легко выполнено с помощью переменной уровня класса с получателем для этой переменной?
Скажем, ваш код выглядит так, в псевдокоде:
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
А в других частях вашей программы проверьте значение 'завершено', чтобы узнать, были ли созданы указанные объекты?
РЕДАКТИРОВАТЬ: Я просто перечитал ваш вопрос и отредактировал его соответствующим образом. . Если это многопоточное приложение, вам также необходимо убедиться, что ваши объекты являются потокобезопасными.