2015-09-03 3 views
1

У меня есть UITableView с изображениями в каждой ячейке, и я хочу, чтобы моя прокрутка была гладкой. Так что я прочитал некоторые должности на stackerflow и теперь я загрузка моих изображений в фоновом потоке:UITableView гладкая прокрутка

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    var cell: BuildingStatusCell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! BuildingStatusCell 
    cell.selectionStyle = UITableViewCellSelectionStyle.None 
    var node = nodesArray[indexPath.row] as! NSMutableDictionary 
    if !checkIfImagesLoaded(node[Api.pictures] as! NSMutableArray) { 
     cell.id = node[Api.buildingStatusId] as! Int 
     cell.date.text = node[Api.date] as? String 
     cell.count.text = String((node[Api.pictures] as! NSMutableArray).count) 
     cell.indicator.hidesWhenStopped = true 
     cell.indicator.startAnimating() 
     dbHelper.getBuildingStatusNode(node, callback: self) 
    } else { 
     cell.id = node[Api.buildingStatusId] as! Int 
     cell.date.text = node[Api.date] as? String 
     cell.count.text = String((node[Api.pictures] as! NSMutableArray).count) 
     dispatch_async(dispatch_get_global_queue(Int(QOS_CLASS_USER_INITIATED.value), 0)) { 
      var image = WorkWithImage.loadImageFromSD((node[Api.pictures] as! NSMutableArray)[0]["image"] as! String)! // Bad 
      dispatch_async(dispatch_get_main_queue()) { 
       cell.imgView.image = image 
       cell.indicator.stopAnimating() 
      } 
     } 
    } 
    return cell 
} 

dbHelper.getBuildingStatusNode (узел обратного вызова: самость) метод выполняется в фоновом потоке также. Но по некоторым причинам, когда я прокручиваю, я все еще получаю некоторую задержку. Я прочитал, что хорошо заполнить мою ячейку данными в tableView: метод willDisplayCell вместо tableView: cellForRowAtIndexPath, и я должен вернуть ячейку быстрее, чем я могу, в метод tableView: cellForRowAtIndexPath. Возникает вопрос, должен я теперь использовать такой код:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    var cell: BuildingStatusCell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! BuildingStatusCell 
    cell.selectionStyle = UITableViewCellSelectionStyle.None 
    return cell 
} 

override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) { 
    var cell: BuildingStatusCell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! BuildingStatusCell 
    var node = nodesArray[indexPath.row] as! NSMutableDictionary 
    if !checkIfImagesLoaded(node[Api.pictures] as! NSMutableArray) { 
     cell.id = node[Api.buildingStatusId] as! Int 
     cell.date.text = node[Api.date] as? String 
     cell.count.text = String((node[Api.pictures] as! NSMutableArray).count) 
     cell.indicator.hidesWhenStopped = true 
     cell.indicator.startAnimating() 
     dbHelper.getBuildingStatusNode(node, callback: self) 
    } else { 
     cell.id = node[Api.buildingStatusId] as! Int 
     cell.date.text = node[Api.date] as? String 
     cell.count.text = String((node[Api.pictures] as! NSMutableArray).count) 
     dispatch_async(dispatch_get_global_queue(Int(QOS_CLASS_USER_INITIATED.value), 0)) { 
      var image = WorkWithImage.loadImageFromSD((node[Api.pictures] as! NSMutableArray)[0]["image"] as! String)! 
      dispatch_async(dispatch_get_main_queue()) { 
       cell.imgView.image = image 
       cell.indicator.stopAnimating() 
      } 
     } 
    } 
} 

А что еще я могу сделать, чтобы сделать мою прокрутку более гладким? BCS У меня все еще есть задержки даже при использовании метода willDisplayCell.

P.S. Исправлен размер изображения в моем UITableViewCells.

+0

Я бы предложил подклассы UITableViewCell и у меня есть cell.configureWithDictionary (cellDictionry), управляющий всей этой информацией, чтобы отодвинуть ее от контроллера представления, после чего вы останавливаете/продолжаете загрузку изображений? когда изображения движутся с экрана, вам больше не нужно «загружать» их в очередях, многие загрузки могут замедлить работу приложения, сколько изображений вы также загружаете? вы могли бы использовать много памяти. –

+1

Я не знаю вашу точную настройку, поэтому я не могу точно сказать, как сделать ее более плавно, но было несколько разных учебников wenderlich по параллельным вызовам с использованием NSURLSession, NSOperation и других полезных классов с помощью apis от Apple, если вы У меня есть время, когда я их прочту. –

+1

Алос, не используйте AFNetworking или SDWebImage, они приятно использовать, когда вы действительно знаете, что происходит в фоновом режиме, но если вы этого не сделаете, вы просто выкалываете дыры в презервативе и по-прежнему занимаетесь сексом, он выполняет свою работу по большей части, но когда что-то происходит плохо, вы не можете его контролировать. –

ответ

6

Попробуйте следующее

  • Попробуйте удалить любую тень.
  • Сделайте ячейку и ее подзоны непрозрачными. Не используйте альфа/прозрачность.
  • Try декодирования изображений в фоновом потоке: Decode images in background thread?
1

Прежде всего, это лучше подкласс UITableViewCell и просто передать ваш объект Api к ячейке и сделать это отображение внутри клетки.

Также лучше использовать некоторую библиотеку, например: расширение AFNetworking или AsyncImageView - его можно использовать в Swift.

Попробуйте удалить любое закругление границы, тень, прозрачные пленки - они могут вызвать задержки. В этом случае вам нужно растеризации:

Связанные вопрос: Sluggish scrolling experience when using QuartzCore to round corners on UIImageView's within a UITableViewCell

+0

Просто обратите внимание, что не лучше использовать какую-то библиотеку для чего-то, что очень легко сделать самому. Пожалуйста, не рекомендуется для людей, которые не понимают, как делать вещи по умолчанию в библиотеке. Особенно, когда эти вещи являются относительно простыми задачами ..... – TheCodingArt

-3

При загрузке изображения из URL требуется время, чтобы загрузить изображение, и что причина в блок прокрутки UITableView. Вы делаете так много работы просто сделать

  1. Используйте этот класс SDWebImage

  2. и в вашем мостиковых заголовочном файле:

    #import "UIImageView+WebCache.h"

  3. Вот пример кода, который должен работать :

    let block: SDWebImageCompletionBlock! = {(image: UIImage!, error: NSError!, cacheType: SDImageCacheType!, imageURL: NSURL!) -> Void in 
        println(self) 
    } 
    
    let url = NSURL(string: node[Api.pictures] as! NSMutableArray)[0]["image"] as! String) 
    
    cell.imgView.sd_setImageWithURL(url, completed: block) 
    
Смежные вопросы