正如标题所示,我的应用程序有问题。让我更详细地解释一下我试图使用项目符号列表实现的目标:
- 该应用程序加载主 menù 并连接到 Firebase,以查看是否有要显示的产品
- 下载产品图片
- 对内容进行动画处理以显示产品信息和图像
我创建了函数来处理连接不起作用或产品不存在的情况。问题是当连接太慢而无法在动画开始之前加载图像时(大约 2 秒(。在这种情况下,应用程序卡住了一点,产品将在动画结束之前显示。
加载代码
override func viewDidLoad() {
super.viewDidLoad()
// The view where the product will be shown
self.productView.alpha = 0.0
// Checks the internet connection
if (ConnectionService.isConnectedToNetwork()) {
fetchDataFromDatabase(downloadCompleted: { (productToShow) in
self.fillPromoView(usingProduct: productToShow)
})
} else {
fillPromoView(nil)
}
}
出现代码
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
UIView.animate(withDuration: 0.5, delay: 2.0, options: UIViewAnimationOptions.curveEaseInOut, animations: {
...
}
}
这里代码下载产品图片:
func fetchDataFromDatabase(downloadCompleted: @escaping ((Product?) -> Void)) {
FirebaseService.instance.getProductList { (productList) in
if (productList.count != 0) {
do {
let productImage = try Data(contentsOf: productList.productImage as URL)
// Fill the IBOutlet with the downloaded image
self.promoProductImg.image = UIImage(data: productImage)
downloadCompleted(productList)
} catch {
downloadCompleted(nil)
}
} else {
downloadCompleted(nil)
}
}
}
我的目标是在下载状态响应或因为连接需要 2 秒以上才能下载图像时启动动画。有什么建议吗?
无论您是否有来自 FireBase 的响应,您在 viewDidSeem 中的代码都会触发。
在抽象级别,您需要允许应用程序知道何时加载了数据(或未加载(
最简单的方法是;
- 为产品详细信息页面准备一个"骨架"模板(这是Facebook版本的示例,请参阅第一个gif(
- 将视图动画代码移出 viewDidAppear 并移入其自己的专用函数中。
- 通过
fetchDataFromDatabase
成功部分中的 NSNotificationCenter 调用此函数(通过此通知范例,您将在fetchDataFromDatabase
函数中"触发"通知,您的 viewController 将"侦听"此通知并做出相应的响应(在本例中,通过在视图中对数据进行动画处理和呈现"((
我会设置视图的默认状态以显示加载过程(中间有UIActivityIndicatorView
的空视图是我所说的最简单的例子(。这样可以确保用户了解应用在处理提取方法时不会冻结。然后,我将通过将UIView.animate
方法移动到其末尾来修改downloadCompleted
方法。这意味着只有在获取过程完成后才会执行任何 UI 更新。
您的问题是,由于机制的异步性质,viewDidAppear
可能会在获取完成之前被调用。