将MBProgressHUD添加到SDWebImage和UICollectionView中

时间:2015-08-21 09:18:14

标签: ios swift sdwebimage mbprogresshud

我的单元格加载时,我一直试图显示progressHUD,它应该显示下载进度是如何进行的。所以我把代码放在SDWebimage进度块中以获得下载进度并将其传递到MBProgress HUD工作,但我不知道我在这里做错了什么!

let url = NSURL(string: (array[indexPath.row][0] as? String)!)
cell.imageView.sd_setImageWithURL(url, placeholderImage: nil, options: nil, progress: { (value1, value2) -> Void in

    self.HUD = MBProgressHUD(view: self.mycollectionView)
    self.view.addSubview(self.HUD)

    self.HUD.mode = MBProgressHUDMode.AnnularDeterminate
    self.HUD.delegate = self
    self.HUD.show(true)
    var x : Float = Float(value1)
    self.HUD.progress = x

    println(value1)
    println(value2)

    }, completed: block)

我也收到了一条错误消息:'MBProgressHUD needs to be accessed on the main thread.'

3 个答案:

答案 0 :(得分:4)

我认为这个机箱是在后台线程上调用的,你需要在

中包含关于代码的HUD
dispatch_async(dispatch_get_main_queue()) {
         // hud here
    }

因为UI更改应该在主线程上执行。

其次我认为机箱会被调用很多次(因为它显示了进度),每次都会将HUD视图添加到子视图中,所以你也需要处理它。

答案 1 :(得分:4)

您只能从主线程更新UI,就像您的错误所说的那样。下载映像是一个不在主线程上执行的异步操作,因此回调块无法更新UI - 除非您在主线程上执行UI更新。要做到这一点,你必须使用gcd在主线程上执行代码,试试这个:

let url = NSURL(string: (array[indexPath.row][0] as? String)!)
cell.imageView.sd_setImageWithURL(url, placeholderImage: nil, options: nil, progress: { (value1, value2) -> Void in

dispatch_async(dispatch_get_main_queue(), {
    self.HUD = MBProgressHUD(view: self.mycollectionView)
    self.view.addSubview(self.HUD)

    self.HUD.mode = MBProgressHUDMode.AnnularDeterminate
    self.HUD.delegate = self
    self.HUD.show(true)
    var x : Float = Float(value1)
    self.HUD.progress = x
})

println(value1)
println(value2)

}, completed: block)

答案 2 :(得分:2)

如果您正在重复使用单元格,则可以在IB中添加活动指示器,然后将其类设置为HUDview或所需的指示器。 然后在collectionView cellForItemAtIndexPath方法中创建单元格添加startAnimating方法,然后在分配图像后检查完成clousure,你可以停止动画。