使用 Swift 进行解析的 SDWebImage 实现
SDWebImage implementation in parse using 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
}
我已经使用 Pods 实现了 SDWebImage 并通过桥接头导入。有没有人知道如何使用Swift解析实现SDWebImage?
集合视图中显示了多少个对象?
既然你提到了SDWebImage
,你也在后台下载图片吗?
如果您想在用户滚动时加载图像,请查看 SDWebImage
的文档。 first use case 描述了如何在不阻塞主线程的情况下在 table 视图单元格中显示图像。集合视图单元格的实现应该类似。
你应该重新考虑你的方法 -
我相信您正在使用 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];
我正在使用解析来检索我的图像和标签并将其显示在集合视图中。问题在于集合视图一次加载所有图像和标签,导致加载时间长且内存使用率高。我想我每次都会加载 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
}
我已经使用 Pods 实现了 SDWebImage 并通过桥接头导入。有没有人知道如何使用Swift解析实现SDWebImage?
集合视图中显示了多少个对象?
既然你提到了SDWebImage
,你也在后台下载图片吗?
如果您想在用户滚动时加载图像,请查看 SDWebImage
的文档。 first use case 描述了如何在不阻塞主线程的情况下在 table 视图单元格中显示图像。集合视图单元格的实现应该类似。
你应该重新考虑你的方法 -
我相信您正在使用 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];