2010-04-03 9 views
5

Sto scherzando con codice per anni su questo, sarei molto grato se qualcuno potesse fornire un esempio di codice che ha scaricato questo file da un server http://www.archive.org/download/june_high/june_high_512kb.mp4, (A proposito, non è in realtà questo file, è solo un esempio perfetto per chiunque cerchi di aiutarmi) e poi riprodurlo dalla directory dei documenti. So che sembra pigro da parte mia chiederlo ma ho provato così tante diverse varianti di NSURLConnection che mi sta facendo impazzire. Inoltre, se sono riuscito a ottenere il file video scaricato dovrei essere corretto nell'assumere questo codice sarebbe poi giocare con successo:iPhone SDK: come si scaricano i file video nella Document Directory e poi li si riproduce?

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"june_high_512kb.mp4"]; 
NSURL *movieURL = [NSURL fileURLWithPath:path]; 
self.theMovie = [[MPMoviePlayerController alloc] initWithContentURL:movieURL]; 
[_theMovie play]; 

Se il codice di cui sopra funzionerebbe in riproduzione di un file video dalla directory del documento, quindi suppongo che l'unica cosa che avrei bisogno di sapere è come scaricare un file video da un server. Quale è quello che sembra essere il mio problema principale. Qualsiasi aiuto è molto apprezzato.

risposta

18

Il codice funzionerà per riprodurre un film.

Il modo più semplice per scaricare è sincrono:

NSData *data = [NSData dataWithContentsOfURL:movieUrl]; 
[data writeToURL:movieUrl atomically:YES]; 

Ma è meglio (per app di risposta, ecc) per scaricare in modo asincrono:

NSURLRequest *theRequest = [NSURLRequest requestWithURL:movieUrl cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:60]; 
    receivedData = [[NSMutableData alloc] initWithLength:0]; 
     NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self startImmediately:YES]; 

Ciò richiede l'attuazione del protocollo informale NSURLConnection:

- (void) connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { 
    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES; 
    [receivedData setLength:0]; 
} 

- (void) connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { 
    [receivedData appendData:data]; 
} 

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

- (NSCachedURLResponse *) connection:(NSURLConnection *)connection willCacheResponse:(NSCachedURLResponse *)cachedResponse { 
    return nil; 
} 

- (void) connectionDidFinishLoading:(NSURLConnection *)connection { 
    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; 
    [connection release]; 
    [self movieReceived]; 
} 

e quindi salvare (e riprodurre) il film file nel metodo movieReceived.

+0

Grazie, buona risposta, in realtà mi ha aiutato molto. Ho apportato una piccola modifica al tuo codice, invece di appendData uso writeData, dato che l'app esplode con appendData quando si scaricano file di grandi dimensioni. Ma ancora eccellente esempio di codice. – Sam

+0

Sì, il mio esempio (semplice) consumerà più memoria rispetto all'utilizzo di NSFileHandle/writeData: will, che farà la differenza per i file di grandi dimensioni. Sono contento che ci abbia aiutato. –

+0

È inoltre possibile utilizzare direttamente il file anziché NSData. Ps: considera file enormi. – fyasar

Problemi correlati