pabloruiz55
pabloruiz55

Reputation: 1306

how to know when NSData's initWithContentsOfURL has finished loading.

I am loading some text from xml and an image, that image takes longer to load than the xml, but I want to show them at the same time.

I am loading the image using

NSData *mydata = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:imgLink]];

How can I set a callback function that lets me know that mydata has the image, so I can add both the image and the text to the view?

Thanks

Upvotes: 3

Views: 3830

Answers (1)

Benjamin Cox
Benjamin Cox

Reputation: 6120

You will have to use NSURLConnection. This is fairly straightforward, but more involved than the NSData method.

First, create an NSURLConnection:

NSMutableData *receivedData;

NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:imgLink]
                                          cachePolicy:NSURLRequestUseProtocolCachePolicy
                                      timeoutInterval:60.0];

NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self];

 if (theConnection) {
    receivedData=[[NSMutableData data] retain];
} else {
    // inform the user that the download could not be made
}

Now, add <NSURLConnectionDelegate> to the header of your class and implement the following methods:

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

The first one should append the data, as shown below, and the final one should create and display the image.

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data;
{
    // append the new data to the receivedData
    // receivedData is declared as a method instance elsewhere
    [receivedData appendData:data];
}

See this document for more details.

Upvotes: 6

Related Questions