2014-02-14 2 views

ответ

7

Вы можете использовать Grand Central Dispatch для этого:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, kNilOptions), ^{ 
    // Call your method. 
}); 
+0

Будет ли это рекурсивно назвать это? – Tukajo

+0

Теперь я вижу, что вы отметили вопрос «рекурсия». Нет, это просто выполняет любой код, который вы помещаете в блок в фоновом потоке. Вы можете, конечно, использовать GCD в тандеме с рекурсией или итерацией. Цель GCD - улучшить параллельное выполнение кода. – geraldWilliam

+2

Для тех, кто находит этот вопрос, не забудьте проверить ответ от 0x7fffffff относительно dispatch_apply. – geraldWilliam

1

Вы могли бы использовать:

[self performSelectorInBackground:@selector(aMethod) withObject:nil]; 

для метода без параметров. Или что-то вроде

[self performSelectorInBackground:@selector(otherMethodWithString:andData:) withObjects:string, data, nil]; 

если у вас есть параметры.

1

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

- (void)method 
{ 
    // start a background proccess that will not block the UI 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

     for (int i = 0; i < 1000000; i++) { 

      if (i == 999) { 

       // Need to iterate with interface elements when inside a background thread. 
       dispatch_async(dispatch_get_main_queue(), ^{ 
        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Found" message:@"Found your number" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil]; 
        [alertView show]; 
       }); 
      } 

      NSLog(@"Count: %d",i); 
     } 

    }); 
} 
+0

Вы хотите 'i <1000000', а не' i> 1000000'. – rmaddy

+0

спасибо, исправил его. – alexandresoli

+0

Он показывает только одно предупреждение, когда он находит номер 999. – alexandresoli

1

Использование GCD - это, безусловно, хороший способ, как отмечали другие.

В качестве альтернативы, если вы хотите, чтобы операция была отменена (например, загрузка веб-ресурса), вы можете рассмотреть подклассификацию NSOperation и проверку на наличие isCancelled.

(AFNetworking на самом деле это делает (например, AFHTTPRequestOperationManager) в принятии/управление веб-запросов.)

заказ яблоке документы на NSOperation, а также this tutorial on Ray Wenderlich's site для получения более подробной информации о NSOperation с.

5

Чтобы сделать это, вы определенно хотите использовать Grand Central Dispatch, но я хотел бы указать, что GCD имеет метод построения только для такого рода вещей. dispatch_apply() выполняет свой блок определенное количество раз в выбранной вами очереди, конечно, отслеживая, на какой итерации вы находитесь на этом пути. Вот пример:

size_t iterations = 10; 

dispatch_queue_t queue = dispatch_queue_create("com.my.queue", DISPATCH_QUEUE_SERIAL); 

dispatch_apply(iterations, queue, ^(size_t i) { 
    NSLog(@"%zu",i);// Off the main thread. 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     // Go back to main queue for UI updates and such 
    }); 
}); 
Смежные вопросы