К сожалению, вы не можете просто добавить асинхронный метод к BlockOperation
. Сама операция завершится, как только будет отправлен асинхронный сетевой запрос (даже если вы отложили completion?()
на 3 секунды позже).
Вместо этого вы захотите обернуть сетевой запрос в специальный асинхронный метод подкласса Operation
, который выполняет все уведомления KVO для правильного поведения Operation
. Подробнее см. Документацию Operation
.
См. { ссылка }, например, с реализацией downloadTask
. Или см. { ссылка } для общего обсуждения.
Кстати, даже если вы не будете использовать BlockOperation
, в тех случаях, когда вы это делаете, помните о addExecutionBlock
из BlockOperation
. Вы можете, например, иметь последовательную очередь, создать BlockOperation
, а затем добавить несколько addExecutionBlock
для данной операции, и они не будут последовательными. Отдельные операции будут вести себя последовательно, но не отдельные блоки, которые вы добавляете к данному BlockOperation
. Как правило, я бы советовал людям избегать addExecutionBlock
с BlockOperation
, пока вы действительно не поняли, что там происходит. Лучше просто использовать главное закрытие при инициализации BlockOperation
.