【发布时间】:2017-08-10 14:47:50
【问题描述】:
我有一个包含五个图像视图的 collectionView 单元格。我正在使用 javimuu 给出的以下答案在后台加载图像。 Link
它运行良好,所有图像都加载到正确的图像视图中。但这是一个非常缓慢的过程,并且图像以随机顺序加载。 在为特定单元格加载完所有图像后,我很难显示活动指示器并隐藏它,即在加载图像时继续显示指示器,并在加载所有 5 个图像时隐藏它。
请帮忙。
更新:
func downloadImageFromLink(link:NSURL,group: dispatch_group_t, completion:(isDone: Bool) -> Void) {
self.image = nil
imageURL = link.absoluteString
dispatch_group_enter(group)
NSURLSession.sharedSession().dataTaskWithURL(link, completionHandler: {
(data, response, error) -> Void in
if error != nil {
print(error)
return
}
if let imageFromCache = imageCache.objectForKey(link.absoluteString) as? UIImage {
self.image = imageFromCache
dispatch_group_leave(group)
return
}
dispatch_async(dispatch_get_main_queue(),{
let imageToCache = UIImage(data: data!)
if self.imageURL == link.absoluteString {
self.image = imageToCache
imageCache.setObject(imageToCache!, forKey: link.absoluteString)
}
dispatch_group_leave(group)
})
}).resume()
}
func loadImagesInCell(cell: WatchFaceCell, images:NSArray ,completion:() ->Void) {
self.startAnimating(cell.contentView)
let group: dispatch_group_t = dispatch_group_create()
for model in images{
if model is WFCreatorModel {
let wfModel: WFCreatorModel = model as! WFCreatorModel
switch wfModel.imageType {
case .Dial:
cell.dialImage.downloadImageFromLink(wfModel.imageURL,group: group, completion: { (isDone) in
})
case .HourHand:
cell.hourHandImage.downloadImageFromLink(wfModel.imageURL,group: group, completion: { (isDone) in
})
case .MinuteHand:
cell.minuteHandImage.downloadImageFromLink(wfModel.imageURL,group: group, completion: { (isDone) in
})
case .SecondHand:
cell.secondHandImage.downloadImageFromLink(wfModel.imageURL,group: group, completion: { (isDone) in
})
case .Notification:
cell.notificationImage.downloadImageFromLink(wfModel.imageURL, group: group,completion: { (isDone) in
})
}//end of switch
}//end of if else
}//end of for
dispatch_group_notify(group, dispatch_get_main_queue()) {
self.stopAnimating(cell.contentView)
completion()
}
}
【问题讨论】:
-
速度缓慢可能是由于图像太大。了解何时完成的一个快速解决方案是保留一个计数器:在调度异步之前递增它并在主队列的调度中递减它(并检查零)。
-
@danh 你能举个例子解释一下吗?
标签: ios iphone swift asynchronous uiimageview