2014-11-26 10 views
0

웹 프런트 엔드의 요청을 처리하는 구현 된 로컬 서버가있는 응용 프로그램이 있습니다. UIWebView는 GUI를 제공하고 사용자는 상호 작용을하며 요청을 처리하고 응답을 웹뷰로 되돌려 보냅니다.현재 메서드를 종료하기 전에 새 UIWebView 내에서 페이지 내용을로드하는 방법

때때로 두 번째 웹보기 (예 : 페이스 북 로그인)를 열어 두 번째 웹보기에서 결과가 반환 될 때까지 기다려야하는 요청을 받고 있습니다.

듀얼 코어 프로세서가있는 iDevice에서이 케이스를 실행하면 예상대로 작동합니다. 하지만 단일 코어 iPhone 4에서 실행할 때 웹 뷰 처리는 현재 메서드 (대기중인 indcator가있는 흰색 페이지)를 벗어날 때까지 차단됩니다. 메인 쓰레드는 자신의 실행 루프에서 이벤트를 처리 할 시간이 있도록

- (void)requestProcessingMethod { // <-- on background thread 
     someCalculations ... 

     dispatch_sync(dispatch_get_main_queue(), ^{ 
     [self displayFacebookLoginWebView]; 
     }); 

     while(!facebookReturnCondition){ 
      [[NSRunLoop currentRunLoop] runUntilDate:[NSDate distantFuture]]; 
      [NSThread sleepForTimeInterval:0.5]; // <-- on single core without this 
               //  facebook webview will not load the login page 
     } 

     return response; // 
    } 

내가 그 행복하지 않다 (나는 이것을 제대로 이해한다면)

나는 현재 스레드 잠을 넣어이 문제를 해결했다. 수면 용 스레드 설정은 매우 열악한 솔루션처럼 보입니다.

배경 스레드에서 백그라운드 UIWebView를 현재 방법 (배경 스레드)을 종료하지 않고 추가 할 수있는 방법이 있습니까?

수동으로 루프 실행을 전환하거나 강제 실행할 수 있습니까?

답변

0

지금이 방법이 효과가 있는지 모르겠습니다. 지금 테스트 할 수 없습니다. 그러나 :

작업 종속성을 사용하여 대기열에서 별도의 작업으로 작업을 시도 할 수 있습니다. 귀하의 경우

당신이이 방법을 사용하는 경우 : 동시성 가이드를 읽고에서

-(void)methodThatCallsRequestProcessingMethod { 

    NSOperationQueue *queue = [[NSOperationQueue alloc]init]; 

    NSInvocationOperation* theMainThreadOp = [[NSInvocationOperation alloc] initWithTarget:self 
        selector:@selector(displayFacebookLoginWebView) object:nil]; 

    NSInvocationOperation* theOp = [[NSInvocationOperation alloc] initWithTarget:self 
        selector:@selector(requestProcessingMethod) object:nil]; 
    [theOp addDependency: theMainThreadOp]; 

    [[NSOperationQueue mainQueue] addOperation: theMainThreadOp]; 
    [queue addOperation:theOp]; 

} 

을, 당신이 다른 큐에서 동작 종속성을 가질 수 있습니다 나타납니다. 즉, UI가 주 스레드에서 실행되고, 나중에 비동기 스레드에서 실행되며, 모든 스레드에서 주 스레드를 지우고 응답하도록 할 수 있습니다.

Apple Concurrency Guide