2014-01-31 1 views
0

스레드에서 NSRunLoop을 사용하는 방법에 대해 몇 가지 질문이 있습니다. Apple의 스레딩 프로그래밍 가이드에는 "귀하의 코드는 실행 루프의 실제 루프 부분을 구현하는 데 사용되는 제어문을 제공합니다. 즉, 실행 루프를 구동하는 while 또는 for 루프를 제공합니다." 그래서,있는 NSURLConnection을 사용할 때하는 새 스레드에서 비동기 적으로 데이터를로드하는 데, 나는 다음과 같은 코드를 작성하고 작업 :"while 루프"또는 "for 루프"를 사용하여 스레드의 NSRunLoop을 구동하십시오.

... 
.... 
NSURLConnection* connection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO]; 
[NSThread detachNewThreadSelector:@selector(downloadThread:) toTarget:self withObject:nil]; 
.... 
... 

선택 "downloadThread는"새 스레드의 진입 점, 다음은 "downloadThread"코드입니다 : 여기

- (int) downloadThread:(id)option { 
    BOOL ret; 
    [connection scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
    [connection start]; 
    while (finished == NO) { 
     ret = [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]; 
    } 
    return 1; 
} 

우리가 루프 문을 사용해야하는 이유 NSRunLoop은, 루프이고, 문제이다 "동안 (마감 == NO)"를 NSRunLoop? 심지어 애플의 문서 언급하지만,하지만 난 그냥 돈 '제어 이해한다. 타이머를 사용하는 경우 다른 손에, 우리는 NSRunLoop을 제어 할 수있는 루프 문을 필요로하지 않고, 그냥 다음과 같이 작동합니다 : 우리가 제어 루프 문을 사용합니다 어떤 상황에서,

... 
.... 
NSTimer* _timer = [NSTimer timerWithTimeInterval:1 target:object selector:@selector(timerFunc) userInfo:nil repeats:YES]; 
[[NSRunLoop currentRunLoop] addTimer:_timer forMode:NSDefaultRunLoopMode]; 
[_timer fire]; 
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]; 
.... 
... 

그래서 NSRunLoop?

+6

NSURLConnection은 기본적으로 백그라운드에서 모든 작업을 수행합니다. 제대로 사용하려면이 스레딩 코드가 필요하지 않습니다. – rmaddy

답변

0

-[NSRunLoop runMode:beforeDate:]에 대해서는 docs을 읽으십시오. 이 메서드는 단일 입력 소스를 처리 한 후 반환됩니다. 따라서 특정 이벤트가 발생할 때까지 입력 소스를 계속 처리하려면 루프를 반복해야합니다.

타이머 코드의 출처가 확실하지 않지만 -runMode:beforeDate:을 호출하면 타이머가 작동 할 것이라고 보장 할 수는 없습니다. 또한 -runMode:beforeDate:은 타이머가 작동했기 때문에 반환되지 않습니다. 따라서이 코드는 적어도 두 가지 이상으로 나에게 잘못되었습니다.

관련 문제