Да, я знаю. Есть много вопросов и ответов о мире 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 мы можем начать с асинхронного вызовите основной поток в начале и продолжайте выполнение операции до тех пор, пока это заканчивается.
Не могли бы вы объяснить мне, почему?
Заранее благодарю.