2012-11-25 11 views
2

CFRunLoop에 대해 읽었지만 여전히 혼란 스럽습니다.iOS : CFRunLoopRun() function confusion

그래서,이 모두가 주 스레드에서 호출되는 가정하에
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; 
[request setURL:[NSURL URLWithString:[NSString stringWithFormat:url]]]; 
[request setHTTPMethod:@"POST"]; 
[request setValue:@"application/xml" forHTTPHeaderField:@"Content-Type"]; 
[request setValue:postLength forHTTPHeaderField:@"Content-Length"]; 
[request setHTTPBody:postData]; 
[[NSURLConnection alloc]initWithRequest:request delegate:self]; 

CFRunLoopRun(); 

, 그것은 메인 스레드를 차단합니다 : 나는 십자가를 내가 나 자신을 위해 명확히하고 싶습니다 코드의 조각을했다? 또는 CFRunLoopRun() 함수 호출을 통해 새 스레드를 생성합니까?

감사합니다.

+0

일반적으로 요청이 백그라운드 스레드에서 진행될 때 실행됩니다. – iDev

답변

3

이것이 기본 스레드에서 호출된다고 가정하면 실제로는 기본 실행 루프가 실행 중이므로 CFRunLoopRun을 호출 할 이유가 없습니다.

NSURLConnection을 사용하는 방식은 호출 스레드를 차단하지 않습니다. 내부적으로 추가 스레드를 생성 할 수 있지만 실제로 신경 쓰지 않아도됩니다. initWithRequest:delegate:은 즉시 반환되며 대리자 메서드는 나중에 호출됩니다 (응답을 받거나 데이터가로드 될 때 등).

+0

흥미 롭습니다. 따라서 delegate의 connectionDidFinishLoading 내에서 다음 호출이 표시됩니다. CFRunLoopStop (CFRunLoopGetCurrent()); 그 결과에 따라 문제가 발생합니까? 기본 실행 루프를 중지하려고합니까? – ymotov

+0

내가보고있는 코드는 보조 스레드에서 실행되도록 설계되었습니다. 'CFRunLoopRun'이 어떻게 작동하는지에 대한 이해에서,'CFRunLoopStop'은'CFRunLoopRun'에 의해 생성 된 중첩 된 실행 루프를 멈추어야 만합니다. 그러나 틀릴 수 있습니다. 메인 스레드에서,이 두 가지 중 어느 것도 이해가되지 않습니다. – omz

+0

그것이 내가 생각한 것이지만 확인해야했습니다. 감사. – ymotov

8

실제로 의미가있는 경우가 있습니다. 재귀 실행 루프를 만드는 동안 (그 라인을 실행할 때 일어날 일) :

반복적으로 실행 루프를 실행할 수 있습니다. 즉 소스 또는 타이머의 처리기 루틴 내에서 실행 루프를 시작하기 위해 CFRunLoopRun, CFRunLoopRunInMode 또는 NSRunLoop 메소드 을 호출 할 수 있습니다. 이렇게하면 외부 실행 루프에서 사용중인 모드를 포함하여 중첩 된 실행 루프를 실행하려는 모드를 사용할 수 있습니다. 실제로 RunLoop을 중지 할 때까지,

- (NSMutableData *)serverRequest 
{ 
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; 
    [request setURL:[NSURL URLWithString:[NSString stringWithFormat:url]]]; 
    [request setHTTPMethod:@"POST"]; 
    [request setValue:@"application/xml" forHTTPHeaderField:@"Content-Type"]; 
    [request setValue:postLength forHTTPHeaderField:@"Content-Length"]; 
    [request setHTTPBody:postData]; 
    [[NSURLConnection alloc]initWithRequest:request delegate:self]; 

    CFRunLoopRun(); 
    return _returnDataFromServer; 
} 

그래서 방법 serverRequest 종료되지 않습니다 :

그래서 요점은 이런 일을하는 것입니다

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { 
    // Append the new data to the instance variable you declared 
    [_connectionData appendData:data]; 

    CFRunLoopStop(CFRunLoopGetCurrent()); 
} 

나는 않을 것 이 작업을 작업 스레드에 전달하는 것이 좋습니다. 실행 루프를 사용하지 않고 동일한 작업을 수행하는 다른 방법이 있습니다.