별도의 스레드에서 실행되는 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.