Handling a NSURLRequest with timeout when using delegate
Asked Answered
R

5

10

I'm using a NSMutableURLRequest to connect to a web site to get a JSON response. I'm doing so by generating the request, and then using NSURLConnection with a delegate of self to handle the async connection. I've implemented all the normal delegate methods:

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
- (void)connectionDidFinishLoading:(NSURLConnection *)connection

All works perfectly with getting data back, dealing with any errors that occur, etc. However with the timeout on the NSURLRequest set to 10 seconds I don't seem to get called in those methods (I expected the didFailWithError to get called). It just sits there forever and I have no notification that it timed out.

Reading the iPhone API docs I don't see any mention of what should happen when the timeout occurs, just that you can set the timeout value. What should happen? I didn't see any other delegate methods in the API that would help. I don't have to manually check for timeouts, do I? Are timeouts only for synchronous requests?

Reiff answered 10/8, 2009 at 0:25 Comment(3)
I concur Corey that I should get it in the didDailWithError method, but it's never getting called. Both breakpoints and logs within that method show it never being called for a timeout.Reiff
For more context, incase it makes a difference, I am using the method talked about in the answer for #332776 to keep track of the connections I have outstanding.Reiff
I looks like this might have been a bug in the beta SDK of 3.0, because as soon as the final was release it worked as expected.Reiff
J
12

Your timeout is received in this method:

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
Jellyfish answered 10/8, 2009 at 8:29 Comment(2)
How can you test for timeout? That appears to be a generic error handler.Hostetter
@Hostetter set url google.com for unavalable port, for example google.com:5555Unruly
C
4

u will br receiving such type of iofo:

in did fail with

error: Error Domain=NSURLErrorDomain Code=-1001 UserInfo=0xed4870 "timed out"

Communist answered 10/8, 2009 at 6:39 Comment(1)
Note NSURLErrorTimedOut = -1001Hostetter
F
3

The timeout behaviour is a bit quirky, see this thread on Apple’s developer forums.

Ferryboat answered 4/6, 2010 at 7:22 Comment(1)
That thread is great! Thanks! Note that thread gives you a reference to developer.apple.com/library/mac/#documentation/Cocoa/Reference/…, which lists all the errors in the NSURLErrorDomainSate
S
2

What I did was this:

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{
    if (error.code == -1001){
        [self showTimeoutAlert];//My method to show dialog with timeout message.
    } else {
        [self showInvalidURLAlert];//My method to show dialog with bad URL message.
    }
}

As said before -1001 is for timeout, in other tests I got -1003 (for bad URL or no connection avaliable).

I was aiming to treat timeout so anything else I treated as bad URL.

Shultz answered 12/2, 2015 at 10:17 Comment(0)
C
1

Put some log statements in each method and check what they give. Whenever it times out, you definitely get a notification on the console about the timeout. I am getting that notification . Check your code and if you are still have problems, let us know.

Communist answered 10/8, 2009 at 4:51 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.