문제

또한보십시오:

쿠키를 사용한 Objective-C 비동기 웹 요청

나는 이 코드를 작성하는 데 하루를 보냈는데 여기에 무엇이 잘못되었는지 말해 줄 수 있는 사람이 있습니까?

WSHelper는 NSObject에서 상속되었으며 NSDocument와 NSObjectController 등 모든 것을 시도해 보았습니다.

-(void) loadUrl: (NSString*) urlStr{
    url = [[NSURL alloc] initWithString:urlStr];
    request = [NSURLRequest requestWithURL:url cachePolicy: NSURLRequestReloadIgnoringCacheData timeoutInterval: 60.0];
    connection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:YES];
    if(connection)
    {
        receivedData = [[NSMutableData data] retain];
            //[connection start];
    }
    else
    {       display error etc...   }
    NSApplication * app = [NSApplication sharedApplication];
    [app runModalForWindow: waitWindow];// <-- this is the problem...
}

-(void)connection: (NSURLConnection*)connection didReceiveData:(NSData*)data{
    progressText = @"Receiving Data...";
    [receivedData appendData:data];
}

-(void)connection: (NSURLConnection *)connection didFailWithError:(NSError *)error{
    progressText = @"Error...";
    NSAlert * alert = [[NSAlert alloc] init];
    [alert setMessageText:[error localizedDescription]];
    [alert runModal];
}


- (void)connectionDidFinishLoading:(NSURLConnection *)connection{
    progressText = @"Done...";
    pData = [[NSData alloc] initWithData:receivedData];
    [self hideWindow];
}

코드는 아무것도 하지 않고 전혀 진행되지 않습니다.나는 심지어 startImmediately:YES를 사용하거나 사용하지 않고 시도해 보았지만 행운이 없습니다!!! 이것은 메인 창에서 실행되므로 스레드와 해당 실행 루프도 성공적으로 실행됩니다.

동기 요청을 호출해 보았는데 제대로 작동합니다!!하지만 비동기 솔루션이 필요합니다.

프로젝트에 CoreServices.Framework를 추가했습니다. 프로젝트에 추가해야 할 것이 더 있습니까?어떤 컴파일러 설정이 있습니까?아니면 NSURLConnection을 사용하기 전에 초기화해야 하는 것이 있나요?

자체 NSRunLoop, Objective-C 및 MAC 개발의 다른 스레드에서 NSURLConnection을 실행하는 솔루션에는 모든 것을 코딩하기 어렵게 만드는 문서 어디에도 샘플 코드가 없습니다.

도움이 되었습니까?

해결책

첫째, 연결 시작을 너무 복잡하게 만들고 있습니다.로 변경:

connection = [[NSURLConnection alloc] initWithRequest:request delegate:self]

제거하다 [connection start].지금:

  • 앱이 정상적으로 실행 루프를 실행하고 있나요?NSURLConnection이 작동하려면 이것이 필요합니다.
  • URL 요청의 동기 로드를 수행할 수 있습니까?
  • 디버거에서 볼 수 있나요? url 당신이 기대하는 게 맞나요?그것은 무엇입니까?
  • 대리인 메시지를 받기 전에 WSHelper 할당을 취소할 수 있습니까?NSURLConnection은 결국 비동기적입니다.

NSURLConnection을 사용하기 위해 특별한 작업을 수행할 필요는 없으며 Foundation 프레임워크의 간단한 부분입니다.특별한 컴파일러 설정이 필요하지 않습니다.사용 전 초기화가 없습니다.아무것도 아님.CoreServices.Framework를 가져오는 것과 같은 작업을 맹목적으로 시도하지 마십시오.

요청 전송이 동기적으로 작동하므로 비동기 측면을 처리하는 데 문제가 있는 것 같습니다.그것은 수:

  • 런루프가 실행되고 있지 않습니다. NSDefaultRunLoopMode 따라서 연결 자체를 예약할 수 없습니다.
  • 코드의 다른 부분이 호출 중입니다. -cancel 로드되기 전에 연결이 중단됩니다.
  • 연결이 로드되기 전에 연결 할당을 취소하고 있습니다.

진짜 문제

아, 사실 방금 무슨 일이 일어나고 있는지 깨달았습니다.당신은 전화하고 있습니다 :

-[NSApp runModalForWindow:]

이 방법의 기능에 대한 설명을 읽어보세요..다음과 같이 런 루프를 실행하지 않습니다. NSURLConnection 기대합니다.나는 정말로 URL 연결을 실행하는 동안 이와 같은 창을 표시하고 싶지 않다고 말하고 싶습니다.

또한 다음을 구현하는 것이 좋습니다. -connection:didReceiveResponse: 대리자 방법도 마찬가지입니다.여기에서 서버가 예상된 상태 코드를 반환하는지 확인하고 싶습니다.

다른 팁

또한 모달 창에서 nsurlconnection을 사용할 때 호출되는 대의원 메소드를 얻지 못한 것과 같은 문제를 충족했습니다.

일부 조사 후 코드 다음 코드를 해결합니다.

NSURLConnection* conn = [[NSURLConnection alloc] initWithRequest:requst delegate:self startImmediately:NO];
[conn scheduleRunLoop:[NSRunLoop currentRunLoop] forMode:NSModalPanelRunLoopMode];
[conn start];

그러나 ConnectionDidFinishLoading이 호출되면 [NSAPP STOPMODAL]이 작동하지 않으면 대신 [NSAPP AbortModal]에게 전화해야합니다.

모달 대화에서 이것을 사용하고 있다고 말합니까? 모달 대화 상자는 실행 루프를 다른 모드로 만듭니다. 일반 실행 루프 모드 외에도 모달 대화 실행 루프 모드에서 실행되도록 예약 하여이 작업을 수행 할 수 있어야합니다. 할당 후이 코드 라인을 추가 해보십시오 connection 안에 loadURL:

[connection scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSModalPanelRunLoopMode];

도움이되기를 바랍니다.

그것이 아무것도하지 않는다는 것을 어떻게 알 수 있습니까? 컴파일 중에 오류 또는 경고 메시지가 있습니까? 프로그램이 실행될 때 콘솔에 오류 메시지가 표시됩니까?

코드에서 브레이크 포인트를 설정하고 당신이 기대할 것으로 예상되는 일을 따르려고 시도 했습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top