У меня есть задача, которая скорее занимает много времени и должна работать в фоновом режиме. Согласно документации, это может быть сделано с помощью NSOperationQueue
. Однако я не хочу сохранять глобальную классом копию NSOperationQueue
так как я действительно только использую его для той одной задачи. Следовательно, я просто установил его, чтобы автовыпустить и надеяться, что это не будет выпущено, прежде чем задача сделана.Работает.
как это:
NSInvocationOperation *theTask = [NSInvocationOperation alloc];
theTask = [theTask initWithTarget:self
selector:@selector(doTask:)
object:nil];
NSOperationQueue *operationQueue = [[NSOperationQueue new] autorelease];
[operationQueue addOperation:theTask];
[theTask release];
Я отчасти волнуюсь, все же. Это, как гарантируют, будет работать? Или мог бы operationQueue
будьте освобождены в какой-то момент и возьмите theTask
с ним?
В документации ничего не говорится о том, что происходит, когда выпускается NSOperationQueue. Было бы безопаснее предположить, что нет никакой гарантии, что задача будет выполнена.
Я мог бы предположить, что NSOperationQueue освобождает свои задачи, когда он выпускается, но я заметил, что задачи завершаются и освобождаются, даже если я освобождаю очередь сразу после добавления задачи. Тем не менее, я не думаю, что буду полагаться на такое поведение - есть еще кое-что, что можно получить, сохранив NSOperationQueue в переменной экземпляра (и выпуская его в dealloc). Переменная экземпляра даст вам возможность вызывать другие методы в очереди (cancelAllOperations, setSuspended и т. Д.).
Нет никакой гарантии, что освободить NSOperationQueue, пока он еще работает, безопасно. Я подозреваю , что это, вероятно, безопасно, и эта гарантия, вероятно, когда-нибудь будет добавлена, но сейчас ее нет. Однако эквивалентный Grand Central Dispatch API действительно гарантирует, что вы можете безопасно освободить его очереди, когда вы закончите их использовать, и будет хранить их столько, сколько они ему понадобятся. Так что, если вы работаете на платформе с GCD, вы можете использовать это, чтобы убедиться, что она не взорвется.
В качестве альтернативы вы можете создать класс-оболочку, который проверяет, завершена ли очередь, и освобождает как очередь, так и себя, когда очередь завершается.
Разве вы не можете использовать объект [NSOperation mainQueue]
, чтобы вам не нужно было беспокоиться об автозапуске? Если вам нужно добавить только одну задачу, которая кажется мне наиболее разумной.