Download file in Objective-C

Mattepuffo's logo
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!


Condividi su Facebook

Commentami!