Как выполнить асинхронную загрузку изображений в динамическом 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
Вы можете позвонить таким образом