Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

what exactly NSUrlConnection ASynchronous means?

Tags:

iphone

i am getting confused what is the difference between Synchronous NSUrlConnection and ASynchronous NSUrlConnection?is there Synchronous or ASynchronous? if we use detachNewThreadSelector in connectionDidFinishLoading method,is it ASynchronous NSUrlConnection? which is the best way?any tutorial ...

like image 591
senthilM Avatar asked Nov 10 '09 11:11

senthilM


4 Answers

Synchronous means that you trigger your NSURLConnection request and wait for it to be done.

Asynchronous means that you can trigger the request and do other stuff while NSURLConnection downloads data.

Which is "best"?

Synchronous is very straightforward: you set it up, fire it, and wait for the data to come back. But your application sits there and does nothing until all the data is downloaded, some error occurs, or the request times out. If you're dealing with anything more than a small amount of data, your user will sit there waiting, which will not make for a good user experience.

Asynchronous requires just a little more work, but your user can do other stuff while the request does its thing, which is usually preferable. You set up some delegate methods that let you keep track of data as it comes in, which is useful for tracking download progress. This approach is probably better for most usage cases.

You can do both synchronous and asynchronous requests with NSURLConnection. Apple's documentation provides a clear explanation of the two approaches and delegate methods required for the latter approach.

like image 164
Alex Reynolds Avatar answered Nov 19 '22 13:11

Alex Reynolds


It seems that you're conflating synchronous/asynchronous connections and threading. In my app I used asynchronous connections as an alternative to threading.

Let's say you want to download a big file without causing the UI to freeze. You have two basic options:

  1. Asynchronous connection. You start with + connectionWithRequest:delegate: (or one of the other non-autorelease options) and it downloads bits of the file, calling your delegate when interesting thing happen. The runloop is still going, so your UI stays responsive. Of course you have to be careful that your delegate don't go out of scope.

  2. Synchronous. You start the connection with + sendSynchronousRequest:returningResponse:error: but the code waits until the download is complete. You'll really need to spawn a new thread (or one of the higher level threading operations that Cocoa supports) or the UI will block.

Which option is "best" or the least painful will depend on the architecture of your application and what you're trying to achieve. If you need to create a thread for a long running process anyway, you might go with the second option. In general I would say the first option is easiest.

It's all pretty well documented on Apple's Developer site.

like image 31
Stephen Darlington Avatar answered Nov 19 '22 13:11

Stephen Darlington


Something which hasn't been mentioned in the other responses is the size of the request. If you're downloading a large file, for example, then using an asynchronous connection is better. Your delegate will receive blocks of data as they arrive. In comparison, the synchronous method will wait for all the data before making it available to you. The delegate can start processing the response sooner (better user experience), or save save it to a file instead of memory (better resource usage). You also have the option to stop the response without waiting for all the data.

Basically, the asynchronous method gives you more control over the connection but at the cost of complexity. The synchronous method is much simpler, but shouldn't be used on the main UI thread because it blocks.

like image 42
Jeremy Bower Avatar answered Nov 19 '22 12:11

Jeremy Bower


In response to the other answers regarding the file size: I think file size doesn't matter. If the server responds really slowly and you're loading data synchronous your UI still freezes, even if you're loading a small amount of data, like 3k.

So I'd go for the asynchronous option in every situation, cause you never know what you're going to get with regards to file size, server responsiveness or network speeds.

like image 36
Bas Holtrop Avatar answered Nov 19 '22 13:11

Bas Holtrop