2010-06-20 6 views

Odpowiedz

15

Nie, nie ma. Aby uzyskać asynchroniczne dane z adresu URL, należy użyć metody .

Trzeba będzie wdrożyć metody NSURLConnectionDelegate:

-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response; 
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data; 
-(void)connectionDidFinishLoading:(NSURLConnection *)connection; 
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error; 
+1

Ten post pokazuje przykład jak używać '+ dataWithContentsOfURL:' na wątek tła, aby osiągnąć ten sam rezultat: http://londonwebdev.com/2011/01/13/retrieving-remote-images- on-background-threads-on-the-iphone/ – user8472

+0

Oczywiście! Wszystko może być zrobione w tle, ale nie było to pytanie. Ponadto, zrobiłbym to samo z NSOperationQueue, a nie jak jest zaimplementowany we wpisie, o którym wspomniałeś ... –

+1

@ user8472, Przeczytaj ponownie pytanie i odpowiedź ... Metoda "dataWithContentsOfURL" NIE jest wykonywana w tło samo w sobie. Oczywiście, możesz wykonać wszystko (prawie) w wątku tła. Masz wiele możliwości - nie tylko tę, którą zasugerowałem (jest to równoległe rozwiązanie dla 'dataWithContentsOfURL'). Możesz także zaimplementować go za pomocą 'performSelectorInBackground ...', 'NSOperation' +' NSOperationQueue', bloków (jak już wspomniałeś) i kilku innych sposobów ... W dolnej linii - nie ma konfliktu w mojej odpowiedzi. –

4

Nie, blokuje bieżący wątek.

Musisz użyć NSURLConnection, aby mieć asynchroniczne żądania.

3

Również można użyć -dataWithContentsOfURL + NSOperation + NSOperationQueue

7

Używam dataWithContentsOfURL grzywny w wątku tła.

-(void)loaddata { 
    NSData* data = [NSData dataWithContentsOfURL:@"some url"]; 
    if (data == nil) { 
     DLog(@"Could not load data from url: %@", url); 
     return; 
    } 
} 

Nazwij coś takiego z głównego wątku.

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

Jeśli chcesz wykonać aktualizacje dla interfejsu użytkownika na końcu danych obciążenia, wywołaj funkcję na głównym wątku.

0

Nie, spowoduje to zablokowanie wątku i załadowanie zawartości pliku do pamięci RAM. Możesz pobierać zawartość bezpośrednio do pliku bez tymczasowego NSData, aby uniknąć ogromnego użycia pamięci RAM. Coś takiego jak to rozwiązanie https://stackoverflow.com/a/6215458/2937913

1

Zgaduję, że zmieniło się to nieco przez lata. Ale teraz te atrybuty będą asynchroniczne.

4

Nie. Możesz jednak użyć NSURLSession.

NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration]; 

NSString *imageURL = @"Direct link to your download"; 

NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfig delegate:self delegateQueue:nil]; 

NSURLSessionDownloadTask *getImageTask = [session downloadTaskWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:imageURL]] completionHandler:^(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error) { 
    dispatch_async(dispatch_get_main_queue(), ^{ 

     UIImage *downloadedImage = [UIImage imageWithData:[NSData dataWithContentsOfURL:location]]; 
    }); 
}]; 
[getImageTask resume];