Правильно сделанный NSOperationQueue - PullRequest
11 голосов
/ 13 января 2011

Я хотел бы знать, как правильно освободить ivar NSOperationQueue, если на нем все еще выполняются некоторые операции, которые обычно могут происходить, когда пользователь внезапно выходит из приложения.В некоторых примерах я видел, что использовался waitUntilAllOperationsAreFinished, например:

<code>
- (void)dealloc {
    [_queue cancelAllOperations];
    <strong>[_queue waitUntilAllOperationsAreFinished];</strong>
    [_queue release];
    ...

, однако многие советуют избегать этого, поскольку это приведет к зависанию цикла выполнения.Итак, как правильно выпустить _queue?А что произойдет, если я не буду ждать завершения операций и просто продолжу выпуск?

1 Ответ

9 голосов
/ 15 января 2011

Почти во всех случаях достаточно будет набрать cancelAllOperations.Единственный раз, когда вам нужно позвонить waitUntilAllOperationsAreFinished, это если вам действительно нужно убедиться, что эти операции выполнены, прежде чем вы продолжите.

Например, вы можете сделать это, если операции обращаются к некоторой общей памяти, и если вы не ждете, то в итоге вы получите два потока, записывающих в эту общую память одновременно.Однако я не могу придумать разумного дизайна, который бы защищал разделяемую память, вызывая задержку блокировки в методе dealloc.Доступны гораздо лучшие механизмы синхронизации.

Итак, краткий ответ таков: вам не нужно ждать завершения всех операций, если только по какой-то причине вашему приложению это не нужно.

...