我的Swift应用程序使用Parse.com作为后端。除此之外,我存储用户配置文件的图像。我存储了同一图像的两个版本:一个缩略图和一个全尺寸图像。当用户点击缩略图时,它会被放大。然后,应用程序加载完整大小的版本,并在加载完成后将其显示在放大的缩略图之上。由于缩略图在加载完整尺寸时看起来很模糊,我已经实现了一个圆形进度条,显示加载进度,给出了正在进行的视觉反馈。
这是处理此过程的方法(progressCircle
是CAShapeLayer
):
func fetchFullImage() {
photoObject.fetchIfNeededInBackgroundWithBlock { (fetchedObject: PFObject!, error: NSError!) -> Void in
if error == nil {
// After fetching object, now we get the full sized image
let userFullImageFile = fetchedObject["fullImage"] as PFFile
userFullImageFile.getDataInBackgroundWithBlock( {
(imageData: NSData!, error: NSError!) -> Void in
if error == nil {
println(">> Success! Full image retrieved.")
self.fullImageView.image = UIImage(data: imageData)
// Hide the progress indicator
self.progressCircle.hidden = true
// Fade in and show the image
self.showFullImage()
}
},
progressBlock: {(percentDone: CInt) -> Void in
println("Loading... \(percentDone)")
// Prints out progress percentage under wifi, but not under 3G!
self.progressCircle.strokeEnd = CGFloat(percentDone) / 100.0
})
} else {
println(error)
}
}
}
现在这是有趣的部分。当我在通过wifi连接的真实设备上运行应用程序时,一切都按预期进行:进度循环随着图像加载等而增长等等。现在当我关闭wifi并且同一设备通过3G连接时,进度循环不会增长。本质上,发生的是progressBlock
闭包没有被调用(我可以看到这个,因为println
语句没有产生结果)。一段时间后图像加载(完成闭包被调用),并且显示正确,但我无法显示进度。
我试图找到这背后的逻辑。我几乎可以理解它是否相反(图像加载速度如此之快以至于无法看到进度),但是在3G图像上加载需要几秒钟,在此期间似乎没有任何事情发生。
有没有人知道什么可以让progressBlock
在这里被调用?我希望能够提供"正在加载"视觉反馈。
提前致谢!