Iphone ios работает в отдельной теме
Каков наилучший способ запуска кода в отдельном потоке? Это:
[NSThread detachNewThreadSelector: @selector(doStuff) toTarget:self withObject:NULL];
Или:
NSOperationQueue *queue = [NSOperationQueue new];
NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self
selector:@selector(doStuff:)
object:nil;
[queue addOperation:operation];
[operation release];
[queue release];
Я делал второй путь, но Cookie Wesley, который я читал, использует первый.
Ответы
Ответ 1
На мой взгляд, лучший способ - с libdispatch, aka Grand Central Dispatch (GCD). Это ограничивает вас iOS 4 и выше, но это просто так просто и просто в использовании. Код для выполнения некоторой обработки на фоновом потоке, а затем сделать что-то с результатами в цикле основного запуска невероятно просто и компактно:
dispatch_async( dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// Add code here to do background processing
//
//
dispatch_async( dispatch_get_main_queue(), ^{
// Add code here to update the UI/send notifications based on the
// results of the background processing
});
});
Если вы еще этого не сделали, посмотрите видео с WWDC 2010 на libdispatch/GCD/blocks.
Ответ 2
Лучший способ для многопоточности в iOS - использовать GCD (Grand Central Dispatch).
//creates a queue.
dispatch_queue_t myQueue = dispatch_queue_create("unique_queue_name", NULL);
dispatch_async(myQueue, ^{
//stuffs to do in background thread
dispatch_async(dispatch_get_main_queue(), ^{
//stuffs to do in foreground thread, mostly UI updates
});
});
Ответ 3
Я бы попробовал все те техники, которые выложили, и посмотрел, какой из них самый быстрый, но я думаю, что это лучший способ сделать это.
[self performSelectorInBackground:@selector(BackgroundMethod) withObject:nil];
Ответ 4
Я добавил категорию в NSThread, которая позволит вам легко выполнять потоки в блоках. Вы можете скопировать код здесь.
https://medium.com/@umairhassanbaig/ios-how-to-perform-a-background-thread-and-main-thread- с вольно-11f5138ba380