2015-08-08 3 views
1

Я использую синтаксический анализ для извлечения моих изображений и меток и отображения их на виде коллекции. Проблема заключалась в том, что просмотр коллекции загружает все изображения и метки одновременно, делая время загрузки долгое время, и использование памяти было высоким. Я думал, что каждый раз я буду загружать 10 ячеек, однако мне рекомендовалось использовать SDWebImage, чтобы сделать приложение более легким. Однако я не знаю, как реализовать его с помощью синтаксического анализа, используя swift. Я подозревал, что я бы поставил код в этом куске кода нижеРеализация SDWebImage в синтаксисе с использованием Swift

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 

    let cell = collectionView.dequeueReusableCellWithReuseIdentifier("newview", forIndexPath: indexPath) as! NewCollectionViewCell 
    let item = self.votes[indexPath.row] 


    let gesture = UITapGestureRecognizer(target: self, action: Selector("onDoubleTap:")) 
    gesture.numberOfTapsRequired = 2 
    cell.addGestureRecognizer(gesture) 


    // Display "initial" flag image 
    var initialThumbnail = UIImage(named: "question") 
    cell.postsImageView.image = initialThumbnail 

    // Display the country name 
    if let user = item["uploader"] as? PFUser{ 
     item.fetchIfNeeded() 
     cell.userName!.text = user.username 


     var profileImgFile = user["profilePicture"] as! PFFile 
     cell.profileImageView.file = profileImgFile 
     cell.profileImageView.loadInBackground { image, error in 
      if error == nil { 
       cell.profileImageView.image = image 
      } 
     } 

     var sexInt = user["sex"] as! Int 
     var sex: NSString! 
     if sexInt == 0 { 
      sex = "M" 
     }else if sexInt == 1{ 
      sex = "F" 
     } 

     var height = user["height"] as! Int 
     cell.heightSexLabel.text = "\(sex) \(height)cm" 



    } 

    if let votesValue = item["votes"] as? Int 
    { 
     cell.votesLabel?.text = "\(votesValue)" 
    } 

    // Fetch final flag image - if it exists 
    if let value = item["imageFile"] as? PFFile { 
     println("Value \(value)") 
     cell.postsImageView.file = value 
     cell.postsImageView.loadInBackground({ (image: UIImage?, error: NSError?) -> Void in 
      if error != nil { 
       cell.postsImageView.image = image 
      } 
     }) 
    } 

    return cell 
} 

Я реализованный SDWebImage с использованием Бобы и импортируемым через Bridging заголовок. Есть ли кто-нибудь, кто знает, как реализовать SDWebImage с использованием синтаксиса с помощью Swift?

ответ

2

Вы должны пересмотреть свой подход -

Я считаю, что вы используете метод collectionViewDelegate - collectionView(_:cellForItemAtIndexPath:)

это срабатывает каждый раз, когда представление коллекции необходимо представление для обработки.

В то вы можете получить доступ к ImageView клеток и установить его изображение (для примера) -

cell.imageView.sd_setImageWithURL(url, placeholderImage:placeHolderImage, completed: { (image, error, cacheType, url) -> Void in }) 

И если вы хотите, чтобы исчезнуть в изображении хорошо, вы могли бы -

cell.imageView.sd_setImageWithURL(url, placeholderImage:placeHolderImage, completed: { (image, error, cacheType, url) -> Void in 
      if (cacheType == SDImageCacheType.None && image != nil) { 
       imageView.alpha = 0; 
       UIView.animateWithDuration(0.0, animations: {() -> Void in 
        imageView.alpha = 1 
       }) 
      } else { 
       imageView.alpha = 1; 
      } 
     }) 

EDIT

Я вижу, что вы используете Parse, поэтому вам не нужен SDWebImage, вам нужно использовать Parse - PFImageView, он будет обрабатывать ваш b ackground fetch для изображения, когда он загружается. Вам нужно будет сохранить ссылку на ваш PFObject, но я считаю, что вы уже это сделали.

Например (внутри cellForItemAtIndexPath) -

imageView.image = [UIImage imageNamed:@"..."]; // placeholder image 
imageView.file = (PFFile *)someObject[@"picture"]; // remote image 

[imageView loadInBackground]; 
+0

Да, я использую collectionView (_: cellForItemAtIndexPath :) и я знаю, как установить изображение. У меня он полностью работает, но время загрузки слишком длинное и разочаровывающее, так как оно загружает все сразу – Satsuki

+0

Пожалуйста, объясните свое. Как cellForItemAtIndexPath должен быть вызван только для видимых ячеек. Вы уверены, что просмотр коллекции загружает все ячейки сразу? – shannoga

+0

да .. но мне не нужны фантастические анимации, пожалуйста, перечитайте мой q uestion.Я мог бы показать свой cellForItemAtIndexPath, если его задали – Satsuki

0

Сколько объектов отображается в виде коллекции? Поскольку вы упомянули SDWebImage, вы загружаете изображения в фоновом режиме?

Если вы хотите загрузить изображения в виде пользовательских прокруток, ознакомьтесь с документацией для SDWebImage. В файле first use case описано, как отображать изображения в ячейках табличного представления, блокируя основной поток. Реализация для элементов коллекции должна быть схожей.

+0

Да спасибо, я прочитал это, но я не знаю, что заменить на sd_setImageWithURL: placeholderImage: метод, поскольку Parse не имеет URL – Satsuki

+0

Так как вам получить изображения из Parse? – florianbuerger

+0

cell.postsImageView.loadInBackground ({(image: UIImage ?, error: NSError?) -> Пустота в моей загрузке в фоновом режиме – Satsuki

Смежные вопросы