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/...