2015-11-18 3 views
1

Я хочу подкласс NSOperation сделать это одновременно, в соответствии с доком Apple, я должен переопределить следующие методы для реализации параллельной работы:Как подкласс класса NSOperation, чтобы сделать его одновременным в IOS?

  1. начала
  2. isExecuting
  3. isFinished
  4. isAsynchronous

Но в соответствии с моим результатом теста я могу позволить объекту NSOperation работать во втором потоке без реализации «isExecuting», «is Finished "и" isAsynchronous ". Я просто пишу код.

[NSThread detachNewThreadSelector:@selector(main) toTarget:self withObject:nil]; 

в способе запуска, а затем в главном потоке я выполнить

[myOperation start] 

то операция может выполняться во втором второго потока вместо основного потока. Может кто-то объяснить это phe

+0

Используйте NSOperationQueue для запуска NSOperation. Установите очередность очереди (или серийную). – rmaddy

+0

NSOperationQueue всегда выполняет операции одновременно, принимая во внимание зависимости. Это не может быть последовательный режим – Coinnigh

+0

@Coinmigh он может быть последовательным, если вы установите максимальное совпадение с 1. – rmaddy

ответ

0

Вы используете решение, которое сегодня считается ужасным.

Либо вам нужны преимущества, которые предлагает NSOperation - вы просто выбросили все это из окна. Удачи. Или вам не нужно нужны преимущества NSOperation, то, пожалуйста, узнайте о GCD и блоках и dispatch_async, чтобы сделать вашу жизнь в десять раз проще.

0

Согласен с @ gnasher729. Если вы просто хотите запустить асинхронный метод, не пытайтесь использовать NSOperation. GCD и блоки будут намного проще.

Вернуться почему вы должны реализовать isExecuting, isFinished, isAsynchronous, кроме start, это потому, что NSOperation делает дополнительную работу о состоянии, приоритет, и управление зависимостями.

Например, вы можете отказаться от асинхронной операции при выходе из представления. По умолчанию реализация метода cancel в NSOperation зависит от состояния операции. Если операция не находится в очереди, она будет завершена немедленно; Если он находится в очереди, но еще не запущен, его isCancelled и isReady будут установлены в YES и ждут, когда очередь вызовет его метод start. Метод start проверяет значение isCancelled; если ДА, он будет завершен немедленно.

 Смежные вопросы

  • Нет связанных вопросов^_^