Работает ли -dataWithContentsOfURL: of NSData в фоновом потоке? - PullRequest
13 голосов
/ 20 июня 2010

Работает ли -dataWithContentsOfURL: NSData в фоновом потоке?

Ответы [ 7 ]

15 голосов
/ 20 июня 2010

Нет, это не так.

Для асинхронного получения данных с 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;
8 голосов
/ 03 июля 2013

Я использую 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];

Если вы хотите выполнить обновление интерфейса в концеloaddata, обязательно вызовите функцию в главном потоке.

5 голосов
/ 17 марта 2016

Нет. Вместо этого вы можете использовать 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];
4 голосов
/ 20 июня 2010

Нет, он блокирует текущий поток.

Вам необходимо использовать NSURLConnection, чтобы иметь асинхронные запросы.

3 голосов
/ 21 ноября 2010

Также вы можете использовать -dataWithContentsOfURL + NSOperation + NSOperationQueue

1 голос
/ 15 марта 2015

Я предполагаю, что это изменилось немного за эти годы.Но в наши дни

NSURLRequest* request = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:urlString]];
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse* response, NSData* data, NSError* error) {
}];

даст вам асинхронный сетевой вызов.

0 голосов
/ 07 августа 2014

Нет, это заблокирует поток, и вы загрузите содержимое файла в оперативную память. Вы можете загружать контент прямо в файл без временных NSData, чтобы избежать огромного использования оперативной памяти. Что-то вроде этого решения https://stackoverflow.com/a/6215458/2937913

...