Does -dataWithContentsOfURL: из NSData работают в фоновом потоке?
Делает -dataWithContentsOfURL: из NSData работают в фоновом потоке?
Ответы
Ответ 1
Нет, это не так.
Чтобы получать данные из асинхронного URL-адреса, вы должны использовать подход NSURLRequest
и NSURLConnection
.
Вам нужно будет реализовать методы 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;
Ответ 2
Я использую dataWithContentsOfURL в фоновом потоке.
-(void)loaddata {
NSData* data = [NSData dataWithContentsOfURL:@"some url"];
if (data == nil) {
DLog(@"Could not load data from url: %@", url);
return;
}
}
Вызовите что-то вроде этого из основного потока.
[self performSelectorInBackground:@selector(loaddata) withObject:nil];
Если вы хотите выполнить обновление ui в конце loaddata, обязательно вызовите функцию в основном потоке.
Ответ 3
Нет, он блокирует текущий поток.
Вам нужно использовать NSURLConnection
, чтобы иметь асинхронные запросы.
Ответ 4
Нет. Однако вы можете использовать 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];
Ответ 5
Также вы можете использовать -dataWithContentsOfURL + NSOperation + NSOperationQueue
Ответ 6
Я предполагаю, что за эти годы это немного изменилось. Но в наши дни
NSURLRequest* request = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:urlString]];
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse* response, NSData* data, NSError* error) {
}];
предоставит вам асинхронный сетевой вызов.
Ответ 7
Нет, это заблокирует поток, и вы загрузите содержимое файла в ОЗУ. Вы можете загружать контент непосредственно в файл без временных NSData, чтобы избежать огромного использования ОЗУ. Что-то вроде этого решения fooobar.com/info/302503/...