2014-12-09 4 views
1

Я развиваюсь в Objective-C.Как использовать фоновый поток в Objective-C?

Я пытаюсь запустить while loop, когда я нажимаю button.

Но я не могу нажать кнопку, потому что while loop блокирует UI.

Есть ли background thread, что я могу запустить while loop в background thread, а также нажать UIButton?

Заранее спасибо.

+1

Посмотрите на эту страницу: http://stackoverflow.com/questions/7055424/ios-start-background-thread – Matz

+0

Читайте также о [Grand Central Dispatch] (https://developer.apple.com/library/ios/documentation/Performance/Reference/GCD_libdispatch_Ref/index.html) –

ответ

10

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

//Start the HUD here 

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

    //Run your loop here 

    dispatch_async(dispatch_get_main_queue(), ^(void) { 
     //stop your HUD here 
     //This is run on the main thread 


    }); 
}); 
2

Попробуйте

dispatch_async(dispatch_get_main_queue(), ^{ 
// your code 
}); 

После того, как он посылает, вы не будете иметь полный контроль над работой. Если вы хотите взять под контроль операцию. Используйте

NSOperationQueue *queue = [[NSOperationQueue alloc] init]; 
[queue addOperationWithBlock:^{ 

    // Background work 
}]; 
+0

Если я использую 'dispatch_async' для начала работы с фоном, как мне закончить эту работу? – Martin

+0

, когда он отправляется в очередь, вы не будете контролировать свой код. капля внутри. – Dev

0

Есть много вариантов для вас, Grand Central диспетчерское это хороший вариант, или вы могли бы использовать NSTimer, чтобы вызвать событие в фоновом режиме каждые х миллисекунды, который также может работать для вас.

dispatch_async(dispatch_get_main_queue(), ^{ 
// your code 
}); 

Или

NSTimer *refreshTimer; 
refreshTimer = [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(YourMethodHere) userInfo:nil repeats:YES]; 
+0

Если я использую dispatch_async, чтобы начать работу с фоном, как мне закончить эту работу? – Martin

+0

@Martin: вы должны использовать «совместное аннулирование»: укажите, что вы можете изменить снаружи, чтобы сказать «вы должны прекратить работать» и код внутри блока, который проверяет это состояние через равные промежутки времени. – Jesper

0

Вы можете использовать dispatch_async для этого purpose.You должны запустить цикл в фоновом потоке, в то время как обновление пользовательского интерфейса должно быть сделано в главном thread.Here является link

0

Способ 1:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
// Write your code here 
}); 

способ 2:

Если вы используете performSelectorInBackground:withObject:, чтобы создать новую тему.

Way 3:

[NSThread detachNewThreadSelector:@selector(yourMethod:) toTarget:self withObject:nil]; 
Смежные вопросы