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