Реализация SDWebImage при разборе с использованием Swift

Я использую синтаксический анализ для извлечения моих изображений и меток и отображения их в представлении коллекции. Проблема заключалась в том, что представление коллекции загружает все изображения и метки сразу, что увеличивает время загрузки и высокое использование памяти. Я думал, что буду загружать 10 ячеек каждый раз, однако мне порекомендовали использовать 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 с помощью Pods и импортировал через заголовок моста. Есть ли кто-нибудь, кто знает, как реализовать SDWebImage с разбором с помощью Swift?


person Satsuki    schedule 08.08.2015    source источник


Ответы (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;
            }
        })

ИЗМЕНИТЬ

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

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

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

[imageView loadInBackground];
person shannoga    schedule 08.08.2015
comment
Да, я использую collectionView(_:cellForItemAtIndexPath:) и знаю, как установить изображение. У меня он полностью работает, но время загрузки слишком долгое и разочаровывающее, так как загружает все сразу. - person Satsuki; 08.08.2015
comment
Пожалуйста, объясните себя. Так как cellForItemAtIndexPath следует вызывать только для видимых ячеек. Вы уверены, что представление коллекции загружает все ячейки сразу? - person shannoga; 08.08.2015
comment
да .. но мне не нужны причудливые анимации, пожалуйста, перечитайте мой вопрос. Я мог бы показать свой cellForItemAtIndexPath, если его спросят - person Satsuki; 08.08.2015
comment
Добавил EDIT к моему ответу - person shannoga; 08.08.2015
comment
Спасибо, я обновил свой вопрос и добавил больше кода, это нормально? - person Satsuki; 08.08.2015
comment
да, он работает полностью, просто найдите способ сделать так, чтобы он загружал 10 за раз. Например, когда он прокручивается вниз, загружается еще один набор из 10 ячеек. - person Satsuki; 08.08.2015
comment
@shannoga - кстати, OP мог бы использовать SDWebImage, но ему пришлось бы (1) понять, что PFFile отвечает на URL-адрес, и (2) результат должен быть кэширован, чтобы избежать повторного запуска. OP также, по-видимому, не понимал, что PFFile loadInBackground создает NSData, а не UIImage. UIImage может быть создан с помощью NSData (разновидности imageWithData). - person danh; 09.08.2015

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

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

person florianbuerger    schedule 08.08.2015
comment
Да, спасибо, я прочитал это, но я не знаю, чем заменить метод sd_setImageWithURL:placeholderImage:, поскольку в Parse нет URL-адреса. - person Satsuki; 08.08.2015
comment
Так как же получить изображения из Parse? - person florianbuerger; 08.08.2015
comment
cell.postsImageView.loadInBackground({ (изображение: UIImage?, ошибка: NSError?) -> Пусто в Я загружаю в фоновом режиме - person Satsuki; 08.08.2015
comment
Кажется, в SDWebImage нет необходимости, Parse делает что-то подобное. Запустите свое приложение в инструментах, используя профиль времени, и проверьте, что замедляет просмотр коллекции. - person florianbuerger; 08.08.2015
comment
Действительно !! Однако, почему он загружается медленно, есть ли способ сделать так, чтобы он не загружался сразу, а загружался по 10 раз или около того? - person Satsuki; 08.08.2015