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!
apple objective-c ios iphone ipad viewdidload ibaction controller
Commentami!