Intereting Posts
Пользовательское изображение навигационной панели + эффект прозрачности не работает для iOS 7 Ограничение GameKit для Bluetooth (альтернатива: выяснение, использует ли GameKit Bluetooth или WiFi) Дешифрование RSA не работает в iOS Атрибут свойства в классе продолжения не соответствует первому классу Может ли приложение iOS войти в состояние, когда его нельзя удалить с устройства? Проверьте, было ли приложение куплено xCode 6 (beta 4) продолжает получать «Симулятор не может быть запущен, потому что он уже используется». Почему моя сборка iOS удалена из секции сборки iTunes Connect после ее обработки? VS Cordova: есть ли способ применить различные настройки config.xml в зависимости от выбранной конфигурации? NSDateFormatter получает stringFromDate неправильно Категории UIView и тень – применяются дважды Потерянное подключение к iOS Simulator как видеочат с помощью webRTC ios экран мерцает после поворота лупы Как добавить дополнительное пространство к краям текста UIButton?

Асинхронно загружать изображения для UITableView с помощью NSURLConnection

У меня есть TableView с customCells, когда пользователь нажимает кнопку «Пуск» на какой-либо ячейке, на которой начинается загрузка. Есть много таких ячеек, поэтому мне нужно реализовать эту загрузку параллельно (асинхронно). Для загрузки изображения и обновления ячейки в виде таблицы я использую следующий код:

#define myAsyncQueue dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) 

Я включаю этот метод в очередь async, который, как я полагал, должен обеспечивать параллельную загрузку изображений. – (void) didClickStartAtIndex: (NSInteger) cellIndex withData:

  (CustomTableViewCell*)data { dispatch_async(myAsyncQueue, ^{ self.customCell = data; self.selectedCell = cellIndex; ObjectForTableCell* tmp =[self.dataDictionary objectForKey:self.names[cellIndex]]; NSURLRequest *urlRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:tmp.imeageURL] cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:60.0]; self.connectionManager = [[NSURLConnection alloc] initWithRequest:urlRequest delegate:self]; }); } -(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { self.urlResponse = response; NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response; NSDictionary *dict = httpResponse.allHeaderFields; NSString *lengthString = [dict valueForKey:@"Content-Length"]; NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; NSNumber *length = [formatter numberFromString:lengthString]; self.totalBytes = length.unsignedIntegerValue; self.imageData = [[NSMutableData alloc] initWithCapacity:self.totalBytes]; } -(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { [self.imageData appendData:data]; self.customCell.progressView.progress = ((100.0/self.urlResponse.expectedContentLength)*self.imageData.length)/100; float per = ((100.0/self.urlResponse.expectedContentLength)*self.imageData.length); self.customCell.realProgressStatus.text = [NSString stringWithFormat:@"%0.f%%", per]; } I tried to set this block to queue - main queue - cause its the place where image is already downloaded, -(void)connectionDidFinishLoading:(NSURLConnection *)connection { dispatch_async(dispatch_get_main_queue(), ^{ self.customCell.realProgressStatus.text = @"Downloaded"; UIImage *img = [UIImage imageWithData:self.imageData]; self.customCell.image.image = img; self.customCell.tag = self.selectedCell; }); [self.savedImages setObject:img forKey:self.customCell.nameOfImage.text]; NSNumber *myNum = [NSNumber numberWithInteger:self.selectedCell]; [self.tagsOfCells addObject:myNum]; } 

Без всех очередей (когда я прокомментирую это) все работает правильно, но только 1 загрузка на одном. Но когда я пытался реализовать код с очередями, в результате он ничего не загружал. Я понимаю, что я ошибался, но я не могу это определить.

Большое спасибо за любую помощь заранее.

Если вы хотите, чтобы он начинался с основы основы, я думаю, вы должны начать с NSURLSession, поскольку NSURLConnection большая часть реализации была устарела и не будет доступна после iOS 9. Для полного справочного руководства по программированию URL-адреса и учебника

Возвращаясь к вашему вопросу, вы должны сделать что-то похожее на это, взяв его из учебника

 // 1 NSURLSessionDownloadTask *getImageTask = [session downloadTaskWithURL:[NSURL URLWithString:imageUrl] completionHandler:^(NSURL *location, NSURLResponse *response, NSError *error) { // 2 UIImage *downloadedImage = [UIImage imageWithData: [NSData dataWithContentsOfURL:location]]; //3 dispatch_async(dispatch_get_main_queue(), ^{ // do stuff with image _imageWithBlock.image = downloadedImage; }); }]; // 4 [getImageTask resume]; 

Но мои личные рекомендации касаются AFNetworking, который лучше всего подходит для сетей iOS и широко используется / тестируется в мире приложений для iOS.

Для загрузки изображений с использованием AFNetworking

 [_imageView setImageWithURLRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://i.imgur.com/fVhhR.png"]] placeholderImage:nil success:^(NSURLRequest *request , NSHTTPURLResponse *response , UIImage *image ){ NSLog(@"Loaded successfully: %d", [response statusCode]); } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error){ NSLog(@"failed loading: %@", error); } ]; 

EDIT: загрузка Async с использованием параллелизма

 // get main dispact queue dispatch_queue_t queue = dispatch_get_main_queue(); // adding downloading task in queue using block dispatch_async(queue, ^{ NSData* imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:imageURL]]; UIImage* image = [[UIImage alloc] initWithData:imageData]; // after download compeletes geting main queue again as there can a possible crash if we assign directly dispatch_async(dispatch_get_main_queue(), ^{ _imageWithBlock.image = image; }); }); 

Используйте этот образец кода от Apple, чтобы решить вашу проблему ленивой загрузки.