Как выполнить асинхронную загрузку изображений в динамическом UITableView?

Теперь у меня есть пользовательская ячейка с изображением и меткой. Позже я печатаю эти ячейки:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell:customCell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! customCell

    var url = NSURL(string: postCover[indexPath.row])

    if let data = NSData(contentsOfURL: url!) { 
        cell.cellImage.image = UIImage(data: data)
    }

    var title = postTitle[indexPath.row]

    cell.cellLabel.text = title

    let indexPath = tableView.indexPathForSelectedRow()

    return cell
}

и когда я открываю приложение и прокручиваю его, он зависает. Как я могу исправить эту ошибку?

Я читал об этом, что я должен использовать асинхронную загрузку изображений в моем tableView, но я не загружаю их уже асинхронно?

Я искал и думал об этом 4-5 дней и ничего. Кто-нибудь может дать мне несколько советов, пожалуйста?

3 ответа

Вы можете использовать третью часть библиотеки SDWebImage на gitHub . Это основано на Objective-C, и есть еще один Kingfisher, основанный на Swift. И, возможно, это то, что вы хотите.

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

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell:customCell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! customCell

    var url = NSURL(string: postCover[indexPath.row])

cell.imageView.image = nil;
        dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);
        dispatch_async(queue, ^(void) {

            NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:parsedData[@"imageLR"]];

            UIImage* image = [[UIImage alloc] initWithData:imageData];
            if (image) {
                 dispatch_async(dispatch_get_main_queue(), ^{
                     if (cell.tag == indexPath.row) {
                         cell.imageView.image = image;
                         [cell setNeedsLayout];
                     }
                 });
             }
        });

return cell
}

для Swift вы можете сделать это как

if let data = self.cache.objectForKey(urlString) as? NSData {
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0)) {
            let image = UIImage(data: data)
            dispatch_async(dispatch_get_main_queue()) {
                cell.imageView.image = image;
            }
        }

Создайте соединительный заголовок в swift.Import AFNetworking заголовочные файлы

а затем найти эти методы setImageWithURLRequest

cell.imageView.setImageWithURLRequest Вы можете позвонить таким образом

Другие вопросы по тегам