Czy -dataWithContentsOfURL: z NSData działa w wątku tła?Czy -dataWithContentsOfURL: z NSData działa w wątku tła?
Odpowiedz
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;
Nie, blokuje bieżący wątek.
Musisz użyć NSURLConnection
, aby mieć asynchroniczne żądania.
Również można użyć -dataWithContentsOfURL + NSOperation + NSOperationQueue
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.
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
Zgaduję, że zmieniło się to nieco przez lata. Ale teraz te atrybuty będą asynchroniczne.
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];
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
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ś ... –
@ 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. –