별도의 스레드에서 실행되는 iPhone iOS


96

별도의 스레드에서 코드를 실행하는 가장 좋은 방법은 무엇입니까? 그것은 :

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

나는 두 번째 방법을 사용했지만 내가 읽은 Wesley Cookbook은 첫 번째 방법을 사용합니다.

답변:


243

제 생각에 가장 좋은 방법은 GCD (Grand Central Dispatch)라고하는 libdispatch를 사용하는 것입니다. 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
    });
});

아직 수행하지 않았다면 libdispatch / GCD / blocks에서 WWDC 2010의 비디오를 확인하십시오.


3.0 호환이되어야합니다. :(
Mike S

1
그렇다면 작업 대기열은 아마도 차선책이 될 것입니다. 또한 동시성에 너무 빨리 들어 가지 않도록하십시오. 단일 스레드 및 프로필을 작성하여 다중 스레드로 전환해야하는지 또는 단일 스레드 코드를 자체적으로 더 효율적으로 디자인 할 수 있는지 확인하십시오. 간단한 작업의 경우에는 performSelector : withObject : afterDelay :를 사용하여 필요한 모든 작업을 수행하고 다중 스레드 프로그래밍과 함께 제공되는 모든 문제를 피할 수 있습니다.
Jacques

나중에 이것을 부활 시켜서 미안하지만 performSelector : withObject : afterDelay를 사용하여 메서드 호출을 생성하면 여전히 비동기 메서드 내부에서 NSAutoReleasePool을 사용해야합니까? 마법처럼 메인 자동 해제 풀을 사용한다면 performSElector : afterDelay가 확실히 더 빠른 옵션입니다.
Mike S

아니요, 메서드가 자체 자동 해제 풀이있는 주 스레드에서 실행되고 있기 때문입니다.
Jacques

4
@Joe 이미 알고있는 말을 할 위험에 처하면 스레드를 죽이는 코드를 작성하는 습관을 가져서는 안됩니다. 장기적으로는 귀 하나 귀하의 경력에 ​​도움이되지 않습니다. 스레드를 죽이지 않는 이유에 대해서는 이 게시물 (또는 이와 유사한 게시물)을 참조하십시오 .
마이 켓

1

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
    });
});

0

사람들이 게시 한 모든 기술을 시도해보고 어떤 것이 가장 빠른지 확인 하겠지만 이것이 최선의 방법이라고 생각합니다.

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

이것은 낮은 우선 순위로 스레드를 시작합니다. gcd를 사용하는 것이 스레딩에 가장 좋은 방법입니다.
Karsten

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.