Хотя обычно вы выпоняетет операции добавляя их в очередь, так делать не обязательно. Так же возможно выполнять объект операции вручную, вызвав метод start, но такой способ не гарантирует, что операция выполнится параллельно с остальным вашим кодом. Метод isConcurrent в классе NSOperation говорит вам будет ли выполнена операция синхронно или асинхронно относительно потока, в котором вызван метод start. По умолчанию этот метод возвращает NO, что значит операция выполнится синхронно в вызывающем потоке.
Если вы хотите выполнить параллельную операцию - это которая выполняется асинхронно относительно вызывающего потока - вы должны написать дополнительный код чтобы запустить операцию асинхронно. Например, вы должны запустить отдельный поток, вызвать асинхронную системную функцию или сделать что-нибудь еще чтобы убедиться, что метод запустил задачу и вернулся мгновенно, по всей вероятности, до того, как задача будет завершена.
Most developers should never need to implement concurrent operation objects. If you always add your operations to an operation queue, you do not need to implement concurrent operations. When you submit a nonconcurrent operation to an operation queue, the queue itself creates a thread on which to run your operation. Thus, adding a nonconcurrent operation to an operation queue still results in the asynchronous execution of your operation object code. The ability to define concurrent operations is only necessary in cases where you need to execute the operation asynchronously without adding it to an operation queue.
Большинству разработчиков никогда не понадобится реализовывать параллельную операцию. Если вы всегда добавляете операцию в очередь операций, вам не нужно реализовывать параллельные операции. Когда вы добавляете в непараллельную операцию в очередь, сама очередь создает поток в котором выполняется операция. Таким образом, добавление непараллельной (непоследовательной) операции в очередь операций все еще приводит к асинхронному выполнению кода объекта операции. Возможность создавать параллельные операции нужно только в тех случаях, когда вам нужно выполнять операцию асинхронно, не добавляя ее в очередь операций.
https://developer.apple.com/library/archive/documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationObjects/OperationObjects.html
Although you typically execute operations by adding them to an operation queue, doing so is not required. It is also possible to execute an operation object manually by calling its start method, but doing so does not guarantee that the operation runs concurrently with the rest of your code. The isConcurrent method of the NSOperation class tells you whether an operation runs synchronously or asynchronously with respect to the thread in which its start method was called. By default, this method returns NO, which means the operation runs synchronously in the calling thread.
If you want to implement a concurrent operation—that is, one that runs asynchronously with respect to the calling thread—you must write additional code to start the operation asynchronously. For example, you might spawn a separate thread, call an asynchronous system function, or do anything else to ensure that the start method starts the task and returns immediately and, in all likelihood, before the task is finished.
Most developers should never need to implement concurrent operation objects. If you always add your operations to an operation queue, you do not need to implement concurrent operations. When you submit a nonconcurrent operation to an operation queue, the queue itself creates a thread on which to run your operation. Thus, adding a nonconcurrent operation to an operation queue still results in the asynchronous execution of your operation object code. The ability to define concurrent operations is only necessary in cases where you need to execute the operation asynchronously without adding it to an operation queue.
For information about how to create a concurrent operation, see
Configuring Operations for Concurrent Execution and
NSOperation Class Reference.