Home / Programmazione / Objective-C / Download file in Objective-C
Mattepuffo

Download file in Objective-C

Download file in Objective-C

Oggi vediamo come scaricare file dalla rete nella nostre app per iPad e iPhone usando gli strumenti standard offerti da iOS.

Partiamo del file di header del nostro controller:

@interface EntrateViewController : UIViewController {
    NSURLConnection *connection;
    NSURLRequest *request;
    NSURL *url;
    NSMutableData *dataResponse;
    NSArray *paths;
    NSString *documentsDirectory;
    NSString *lastEntrateFile;
}

@property (weak, nonatomic) IBOutlet UIBarButtonItem *btnRefresh;

- (IBAction)download:(id)sender;

@end

Abbiamo un UIBarButtonItem, al quale abbiamo collegato una IBAction.

Passando al file di implementazione, vi posto solo ciò che ci serve:

#import "EntrateViewController.h"

@interface EntrateViewController ()

@end

@implementation EntrateViewController
@synthesize btnRefresh;

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
     documentsDirectory = [paths objectAtIndex:0];
}

- (IBAction)download:(id)sender {
    url = [NSURL URLWithString:[@"http://www.sito.com/" stringByAppendingString:@"last.json"]];
    request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:60];
    dataResponse = [[NSMutableData alloc] initWithLength:0];
    connection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:YES];
}

#pragma mark Connessione

// INIZIO CONNESSIONE E CREAZIONE CONTENITORE DATI
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
    [dataResponse setLength:0];
}

// PACCHETTI IN RICEZIONE VENGONO ACCODATI
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData*)data {
    [dataResponse appendData:data];
}

// ERRORE DA GESTIRE
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
}

// CONNESSIONE E TRASMISSIONE AVVENUTE CON SUCCESSO
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
    if (dataResponse) {
        [dataResponse writeToFile:lastEntrateFile atomically:YES];
    }
}

@end

Il codice tende ad essere un pò prolisso come al solito; ecco perchè sto facendo la migrazione ad un framework specfico (di cui parlerò prossimamente!).

Nel metodo viewDidLoad istanziamo i percorsi di salvataggio del file in locale, che abbiamo impostato nello spazio dedicato alla app (detta in parole molto povere).

Nel metodo download inizializiamo la connessione, impostando l'url di richiesta e il file da scaricare.

Sotto abbiamo diversi metodi di callback in stile iOS; su ognuno ho messo un breve commento; spiegare tutto sarebbe troppo lungo.

Certo è che anche se questo funziona, lo trovo molto prolisso.

Purtroppo questi metodi di callback allungano di molto il codice.

Ma vedremo come "smaltire" un pò il codice!

Ciao!