2008-11-05 2 views
4

내 iPhone 응용 프로그램과 함께 NSURL, NSURL [Mutable] Request, NSURLConnection으로 큰 성공을 거두었습니다. 스탠드 얼론 코코아 애플리케이션을 컴파일 할 때 간단한 HTTP 요청을하기위한 10 라인 프로그램 인 경우 컴파일러 오류 또는 경고가 없습니다. 프로그램은 잘 컴파일되지만 HTTP 요청은 웹 서버에 보내지지 않습니다 (저는 tcpdump를 실행하고 아파치 로그를 병렬로 보면서). 아이폰 앱에서 매우 비슷한 코드를 실행하면, 기본적으로 복사/붙여 넣기가 악의처럼 작동합니다.코코아 : NSURLConnection이 HTTP 요청을 시도하지 않음

단순화를 위해이 코드 조각에서 NSURLConnection에 대한 대리인의 'obj'선언 코드를 보관했습니다. 또한 GCC에 다음을 전달 해요 :

의 gcc -o foo는 foo.m -lobjc -framework 코코아

덕분에 어떤 통찰력.

#import <Cocoa/Cocoa.h> 

int main (int argc, char *argv[]) 
{  

NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 
NSString * urlstr = @"http://tmp/test.php"; 
[NSApplication sharedApplication]; 
NSObject *obj = [[NSObject alloc] init]; 
NSURL *url = [NSURL URLWithString: urlstr];  
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url]; 

    if([request isKindOfClass:[NSMutableURLRequest class]]) 
    NSLog(@"request is of type NSMutableURLRequest"); 


[request setHTTPMethod:@"GET"]; 
[request setCachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData]; 
NSURLConnection *connection = [[NSURLConnection alloc] 
          initWithRequest:request 
        delegate:obj 
       startImmediately:YES]; 

if(connection) 
    NSLog(@"We do have a connection."); 

[pool release]; 
return 0; 

}

+0

그런데 objc 라이브러리에 링크 할 필요없이 ... 코코아 프레임 워크에 추가됩니다. –

답변

6

다른 포스터가 당신에게 거의 대답했지만, 나는 몇 가지를 추가 할 것이라고 생각했습니다.

먼저, 코코아에 링크 할 필요가 없습니다. 기본 프레임 워크에 링크 만하면됩니다. 또한 Window 서버에 연결할 필요가 없으므로 [NSApplication sharedApplicaiton] 호출을 제거 할 수 있습니다. 간단한 콘솔 테스트 응용 프로그램을 시작하려면 지금 가지고있는 것을 사용하고 [pool realease] 호출 전에 다음을 추가하십시오.

[[NSRunLoop currentRunLoop] run];

그러나 이는 실제로는 차단되며 실제로는 반환되지 않을 수 있습니다. 이것을 호출하기 전에 백그라운드에서 실제로 코드를 수행하기를 원할 경우 타이머를 추가 할 수 있습니다. 자세한 사용 방법은 NSRunLoop의 설명서를 참조하십시오.

4

NSURLConnectionNSRunLoop에 의존 비동기 API입니다. 게시 된 코드는 연결이 실행될 런 루프를 생성하지 않습니다. 따라서 Cocoa는 연결을 생성 할 수 없으므로 nil을 반환합니다. 볼거리 :

1) 콘솔에있는 항목이 있습니까? NSURLConnection이 예외를 던지거나 오류를 기록합니까?

2) 대신 동기 API를 사용하면 어떻게됩니까? + [NSURLConnection sendSynchronousRequest:returningResponse:error:]

3)이 코드의 요점은 무엇입니까? 코코아는 main() 함수에서 직접 실행하도록 설계되지 않았습니다. Xcode에서 제공하는 응용 프로그램 템플릿을 사용하지 않는 특별한 이유가 있습니까? 실행 루프, 자동 풀 풀 등을 설정해야합니다.

+0

그리고 FWIW, 동기식 API는 NSRunLoop을 당신을 위해 최선으로 회전시킵니다. – ipmcc

관련 문제