Cocoa:NSURLConnection没有尝试进行HTTP请求

5
我在我的iPhone应用程序中使用NSURL、NSURL[Mutable]Request和NSURLConnection取得了重大成功。当尝试编译一个独立的Cocoa应用程序,写一个10行的程序来进行简单的HTTP请求时,编译器没有任何错误或警告。程序能够编译成功,但是HTTP请求从未发送到我的Web服务器(我正在同时运行tcpdump和观察Apache日志)。当我在iPhone应用程序中运行非常相似的代码时,基本上是复制/粘贴的,一切都很顺利。
出于简单起见,我将委托给NSURLConnection的'obj'声明的代码保留在此代码片段之外。我还将以下内容传递给gcc:
gcc -o foo foo.m -lobjc -framework cocoa
感谢您的任何见解。
#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;

}


顺便说一下,您不必链接到objc库...它将随Cocoa框架一起添加。 - Jason Coco
2个回答

6
另一位用户已经为您回答了这个问题,但我想补充一些内容。
首先,您不需要链接到Cocoa,只链接到Foundation框架就可以了。另外,由于您不需要连接到Window Server,所以可以删除[NSApplication sharedApplication]调用。如果您只想要一个简单的控制台测试应用程序来开始,请使用您现在拥有的内容,并在[pool release]之前添加以下内容:
[[NSRunLoop currentRunLoop] run];
但请注意,这将阻塞并可能永远不会返回。在调用此方法之前,您可以添加定时器,如果您希望代码实际上在后台执行某些操作 :) 有关更多使用NSRunLoop的方法,请参阅文档。

4

NSURLConnection 是一个异步 API,依赖于 NSRunLoop。您发布的代码没有为连接创建运行循环。因此,我认为 Cocoa 无法创建连接,因此返回 nil。需要注意以下几点:

1)控制台有没有任何信息?NSURLConnection 是否抛出异常或记录错误?

2)如果使用同步 API 会发生什么?+[NSURLConnection sendSynchronousRequest:returningResponse:error:]

3)这段代码的目的是什么?Cocoa 并不适用于直接从主函数中运行。您是否有特定的原因没有使用 Xcode 提供的应用程序模板,这些模板将负责设置运行循环、自动释放池等等?


顺便说一句,就我所知,同步API只是为你旋转NSRunLoop。 - ipmcc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接