Tom Jacky
Tom Jacky

Reputation: 203

When using NSURLConnection in main(), why the connection can not finished?

I'm testing the HTTPFileUploadSample now. Because I want to use it to create a type of command tool line program, so i call the method in the main() function, like this:

int main (int argc, const char * argv[])
{
    @autoreleasepool {
        Uploader *upl = [Uploader alloc]; 
        [upl initWithURL:[NSURL URLWithString:@"http://localhost/uploader.php"]
                filePath:@"/test.txt"
                delegate:upl
            doneSelector:@selector(onUploadDone)
           errorSelector:@selector(onUploadError)];
           //[[NSRunLoop currentRunLoop] run];   
   }
   return 0;
}

I found it can create the connection and post request normally, but it can not finish the connection, because it do not call those delegate methods(connection:didReceiveResponse: or connection:didReceiveData: or connectionDidFinishLoading:) at all. So I call the method [[NSRunLoop currentRunLoop] run] to run loop (as the comment in codes), then everything is ok. I do not know why. Can anybody give me some explanation? Thx!

Upvotes: 0

Views: 88

Answers (1)

Rob Napier
Rob Napier

Reputation: 299355

The runloop is a big event handler infinite loop (well, infinite until it's stopped). It watches various sources and when they generate events it dispatches those events to listeners. This is a very effective way to manage asynchronous operations on a single thread.

NSURLConnection (and many other things in Cocoa) rely on the runloop for their processing. If nothing runs the runloop, then the events aren't processed.

Upvotes: 1

Related Questions