2015-03-30 5 views
0

Есть ли разница при использовании этого (это код только для целей тестирования):NSOperation против НОДА для обновления зрения

dispatch_async(dispatch_get_main_queue(), ^{ 
       [self.progressBar setProgress:progressValue]; 
}); 

вместо этого:

[[NSOperationQueue mainQueue] addOperationWithBlock:^ 
{ 
    [self.progressBar setProgress:progressValue]; 
}]; 

Я использую код выше в этом контексте:

NSOperationQueue *progressQueue = [[NSOperationQueue alloc] init]; 


    [progressQueue addOperationWithBlock:^{ 
     for (int i = 1; i <= 10; i++) { 
      sleep(1); 
      float progressValue = (float)i/10.0; 

      /* GCD 
      dispatch_async(dispatch_get_main_queue(), ^{ 
       [self.progressBar setProgress:progressValue]; 
      }); 
      */ 
      /* Does this have the same effect as using GCD from above 
      [[NSOperationQueue mainQueue] addOperationWithBlock:^ 
      { 
        [self.progressBar setProgress:progressValue]; 
      }]; 
      */ 
     } 
    }]; 
+0

В вашем случае я бы использовал GCD. NSOperation имеет некоторые функции: их можно отменить и иметь зависимости. GCD можно использовать для работы с файлами и блоками памяти. Вам нужно принять решение по задаче, которую вы пытаетесь решить. –

+0

@ Cy-4AH спасибо за ваш ответ, я буду помнить об этом. Да, я прекрасно понимаю, что NSOperation предлагает более высокий уровень абстракции при работе с потоками и имеет хорошие функции (у которых GCD нет), как отмена операций из очереди. Но меня интересовали те два примера, которые выполняют одну и ту же задачу или нет? – Whirlwind

+2

NSOperation - это объект какао вместо GCD. Используйте NSOperation только тогда, когда вы не можете делать то, что хотите, с GCD – thedjnivek

ответ

0

То же самое, но на самом деле ...!

Как @BradLarson сказал здесь NSOperation vs Grand Central Dispatch

Перед НОД, я использовал много NSOperations/NSOperationQueues в моих приложений для управления параллелизмом. Однако, поскольку я начал регулярно использовать GCD, я почти полностью заменил NSOperations и NSOperationQueues блоками и очередями отправки. Это произошло с , как я использовал обе технологии на практике, и из профилирования , которые я выполнил на них.

Во-первых, при использовании NSOperations и NSOperationQueues существует нетривиальное количество накладных расходов. Это объекты какао, и их необходимо выделить и освободить. В приложении iOS, которое I написало, которое отображает трехмерную сцену при 60 FPS, я использовал NSOperations для , инкапсулируя каждый визуализированный кадр. Когда я профилировал это, создание и удаление этих NSOperations составляли значительную часть циклов CPU в запущенном приложении и замедляли вещи вниз. Я заменил их простыми блоками и очередью GCD serial , и эти служебные данные исчезли, что привело к значительному повышению производительности рендеринга . Это было не единственное место, где я заметил накладные расходы с использованием NSOperations, и я видел это как на Mac, так и на iOS.

Во-вторых, есть изящество к блочному методу отправки, который является трудным , чтобы соответствовать при использовании NSOperations. Это невероятно удобно для обернуть несколько строк кода в блоке и отправить его на в последовательную или параллельную очередь, где для создания пользовательского NSOperation или для NSInvocationOperation для этого требуется гораздо больше кода поддержки. Я знаю, что вы можете использовать NSBlockOperation, но вы также можете отправить на GCD. Обертка этого кода в блоках inline с соответствующей обработкой в ​​вашем приложении приводит, на мой взгляд, к лучшей организации кода, чем к отдельным методам или пользовательским NSOperations, которые инкапсулируют эти задачи.

NSOperations и NSOperationQueues по-прежнему имеют очень хорошее применение. GCD имеет никакой реальной концепции зависимостей, где NSOperationQueues может настроить довольно сложные графики зависимостей . Я использую NSOperationQueues для этого в нескольких случаях.

В целом, хотя я обычно выступаю за использование наивысшего уровня абстракции, которая выполняет задачу, это один случай, когда я утверждаю для более низкого уровня API GCD. Среди разработчиков iOS и Mac, о которых я говорил , большинство из них предпочитают использовать GCD более NSOperations, если они не нацелены на версии ОС без поддержки (до IOS 4.0 и Snow Leopard).

+0

Это вводит в заблуждение. В NSOperations может быть * больше * накладных расходов, но это не распределение и освобождение. Блоки GCD (которые передаются в очереди) также являются выделенными кучами объектами, поэтому, поскольку управление памятью, это то же самое распределение и освобождение от освобождения. Если вы предпочитаете работать с NSOp, не стесняйтесь делать это до тех пор, пока вы не профилируете свое приложение, как этот парень, и не увидите, что это проблема. – ipmcc

0

Эти два варианта фактически одинаковы.

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