Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Set progress bar for downloading NSData

Tags:

ios

xcode4.5

NSURL *url = [NSURL URLWithString:@"http://i0.kym-cdn.com/entries/icons/original/000/005/545/OpoQQ.jpg?1302279173"]; 
NSData *data = [NSData dataWithContentsOfURL:url]; 
imageView.image = [[[UIImage imageWithData:data];

I want to set progress bar while downloading.

like image 348
razesh Avatar asked Nov 07 '13 09:11

razesh


2 Answers

To give a more detailed example:

in your .h file do

@interface YourClass : YourSuperclass<NSURLConnectionDataDelegate>

in your .m file do

@property (nonatomic) NSMutableData *imageData;
@property (nonatomic) NSUInteger totalBytes;
@property (nonatomic) NSUInteger receivedBytes;

And somewhere call

NSURL *url = [NSURL URLWithString:@"http://i0.kym-cdn.com/entries/icons/original/000/005/545/OpoQQ.jpg?1302279173"];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:YES];

And also implement the delegate methods

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) urlResponse;
    NSDictionary *dict = httpResponse.allHeaderFields;
    NSString *lengthString = [dict valueForKey:@"Content-Length"];
    NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
    NSNumber *length = [formatter numberFromString:lengthString];
    self.totalBytes = length.unsignedIntegerValue;

    self.imageData = [[NSMutableData alloc] initWithCapacity:self.totalBytes];
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    [self.imageData appendData:data];
    self.receivedBytes += data.length;

    // Actual progress is self.receivedBytes / self.totalBytes
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    imageView.image = [UIImage imageWithData:self.imageData];
}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
    //handle error
}
like image 158
Marc Avatar answered Sep 28 '22 08:09

Marc


You can't get progress call backs by using that method.

You need to use an NSURLConnection and NSURLConnectionDataDelegate.

The NSURLConnection then runs asynchronously and will send callbacks to its delegate.

The main ones to look at are...

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response;
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error;
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data;

and

- (void)connectionDidFinishLoading:(NSURLConnection *)connection;

These are all used for getting the connection to do what you're already doing.

EDIT

Actually, see Marc's answer below. It is correct.

like image 33
Fogmeister Avatar answered Sep 28 '22 08:09

Fogmeister