Всегда ли NSOperationQueues завершает свои очереди перед освобождением?
Мне дали задание очистить некоторый существующий код Swift в нашем проекте, который только что был преобразован в Swift 3. Однако я продолжаю видеть это, что кажется мне подозрительным.
OperationQueue().addOperation(someOperation)
Вот проблемы / проблемы, которые у меня есть...
- Экземпляр очереди создается и используется тут же. Никакая ссылка на это не сохранена для использования в другом месте.
- Из-за вышеизложенного в очереди будет только одна операция, так зачем вообще использовать очередь?
- Поскольку никто не удерживает ссылку на очередь в ARC, не должна ли она быть немедленно удалена, и если да, что происходит с самой выполняющейся сейчас операцией? Он прерывается, прерывается или все еще завершается?
В любом случае, мне интересно, что я что-то упустил или не знаю о "функции" NSOperationQueue и NSOperations, которая делает этот код понятным. Кто-нибудь может пролить свет на это, или вы согласны, что это плохая практика?
1 ответ
Я тоже видел эту модель. Я думаю, что это работает как NSURLConnection: NSOperationQueue "знает", что у него есть ожидающая операция, и не позволяет себе немедленно прекратить существование. Также имейте в виду, что NSOperationQueue на самом деле не "вещь"; это своего рода фронт для основной очереди отправки.
Имеет определенный смысл использовать этот шаблон в ситуациях, когда нет разумного места для хранения ссылки на очередь. И вы можете использовать его для мощного эффекта, как в этом примере, где операция имеет зависимости и, следовательно, не выполняется до тех пор, пока все зависимости не будут.
Лично, однако, если я не воспользуюсь возможностями NSOperation такого рода, я бы более склонен использовать GCD напрямую.
(Что касается вашей средней точки зрения, не имеет смысла выполнять ее в основном потоке, потому что, что если операция будет продолжительной? Вы заблокируете основной поток. Однако, обратите внимание, что если все, что вы пытаетесь сказать, это "делай это после всего остального", Свифт дает тебе defer
.)