Set progress bar for downloading NSData

3 Solutions Collect From Internet About “Set progress bar for downloading NSData”

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:@""];
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

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;


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

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


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

You can use MBProgress Hud class for loading view. You can download only two classes from here :-
After you write this code in that class which you want to load the data
Example :In your viewDidLoad you write this

- (void) viewDidLoad
    MBProgressHud *spinner =  [MBProgressHUD showHUDAddedTo:self.view animated:YES];

        spinner.mode = MBProgressHUDModeCustomView;

        [spinner setLabelText:@"Loading....."];

        [spinner setLabelFont:[UIFont systemFontOfSize:15]];

        [spinner show:YES];

        [self performSelectorInBackground:@selector(getData) withObject:nil];

- (void) getData
     NSURL *url = [NSURL URLWithString:@""]; 

        NSData *data = [NSData dataWithContentsOfURL:url]; 

        imageView.image = [[[UIImage imageWithData:data];

        [spinner hide:YES];

        [spinner removeFromSuperViewOnHide];