Демистификация NSOperation: параллельный и непараллельный и асинхронный шаблоны

Да, я знаю. Есть много вопросов и ответов о мире NSOperation, но у меня все еще есть некоторые сомнения. Я попытаюсь объяснить свои сомнения с помощью вопроса, состоящего из двух частей. Они связаны друг с другом.

В сообщении SO nsoperationqueue-and-concurrent-vs-non-concurrent, Darrenнаписал, что

«параллельная» операция является параллельной сама по себе; это не нужно NSOperationQueue, чтобы создать для него поток.

Но немного поискав, я обнаружил, что NSOperation, даже если он объявлен параллельным (посредством переопределения метода isConcurrent, который возвращает YES), можно добавить в NSOperationQueue. Что это значит? Если я добавлю параллельную NSOperationв очередь, что происходит внутри? Наоборот, что произойдет, если я использую параллельную операцию как есть (без добавления ее в очередь)?

Примечание, взятое из документа Apple, ясно:

... очереди операций игнорируют значение, возвращаемое isConcurrent и всегда вызывайте метод start вашей операции из отдельная нить. ...В общем, если вы всегда используя операции с очередью операций, нет причин делать их одновременно.

Затем меня очень интересует использование асинхронного шаблона в NSOperation.Я нашел хорошее руководство Дейва Дрибина( параллельные операции). Я понял общий смысл его поста.

Вы не можете использовать асинхронный шаблон (например, используя асинхронный запрос NSURLConnection), так как делегаты не могут быть вызваны. По завершении mainоперация удаляется. Решение состоит в том, чтобы переопределить метод startдля управления жизненным циклом операции... И работа с циклами выполнения может быть проблемой.

Теперь, пытаясь понять его сообщение, я сомневаюсь в необходимости запуска метода startв основном потоке.

- (void)start
{
    if (![NSThread isMainThread])
    {
        [self performSelectorOnMainThread:@selector(start) withObject:nil waitUntilDone:NO];
        return;
    }

    // other code here...
}

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

Не могли бы вы объяснить мне, почему?

Заранее благодарю.

5
задан Community 23 May 2017 в 12:08
поделиться