2008-11-05 2 views
4

У меня был значительный успех с NSURL, NSURL [Mutable] Request, NSURLConnection с моими iPhone-приложениями. При попытке скомпилировать отдельное приложение Cocoa, 10-строчную программу для простого HTTP-запроса, есть нулевые ошибки или предупреждения компилятора. Программа компилируется отлично, но HTTP-запрос никогда не был сделан на моем веб-сервере (я запускаю tcpdump и просматриваю журналы Apache параллельно). Когда я запускаю очень похожий код в приложении для iPhone, по существу копируя/вставляя в него зло, все это работает золотым.Какао: NSURLConnection не пытается HTTP-запрос

Я просто сохранил код для объявления 'obj' в делегате NSURLConnection из этого фрагмента кода для простоты. Я также пропускание следующего к НКУ:

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 ... она добавится в рамки какао. – 2008-11-08 20:16:14

ответ

6

Другой плакат в значительной степени ответил на это за вас, но я думал, что просто добавлю несколько вещей.

Во-первых, вам действительно не нужно ссылаться на Cocoa для этого, просто привязка к Foundation framework в порядке. Кроме того, поскольку вам не требуется подключение к Window Server, вы можете избавиться от вызова [NSApplication sharedApplicaiton]. Если вы хотите использовать простое консольное тестовое приложение для начала, используйте то, что у вас есть, и добавьте это перед вызовом [пул realease]:

[[NSRunLoop currentRunLoop] run];

Обратите внимание, что это блокирует и может фактически не вернуться. Прежде чем вызывать это, вы можете добавить таймер, если хотите, чтобы ваш код действительно что-то делал в фоновом режиме. См. Документацию по NSRunLoop для получения дополнительных способов использования этого.

4

NSURLConnection представляет собой асинхронный API, который опирается на NSRunLoop. Ваш опубликованный код никогда не создает цикл запуска для подключения. Поэтому я предполагаю, что Cocoa не сможет создать соединение и поэтому возвращает nil. Что посмотреть в:

1) Что-нибудь в консоли? Является ли NSURLConnection исключением или регистрации ошибки?

2) Что произойдет, если вы используете синхронный API? + [NSURLConnection sendSynchronousRequest:returningResponse:error:]

3) В чем смысл этого кода? Какао не предназначен для непосредственного запуска непосредственно из функции main(). Есть ли особая причина, по которой вы не используете шаблоны приложений, предоставленные Xcode, которые будут заботиться о настройке цикла запуска, пула автозапуска и т. Д.?

+0

И FWIW, синхронный API просто закручивает NSRunLoop для вас, насколько я могу судить. – ipmcc 2012-01-23 13:31:33

Смежные вопросы