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];