如何在 iOS 上显示动画之前正确设置网络超时



正如标题所示,我的应用程序有问题。让我更详细地解释一下我试图使用项目符号列表实现的目标:

  • 该应用程序加载主 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 中的代码都会触发。

在抽象级别,您需要允许应用程序知道何时加载了数据(或未加载(

最简单的方法是;

  1. 为产品详细信息页面准备一个"骨架"模板(这是Facebook版本的示例,请参阅第一个gif(
  2. 将视图动画代码移出 viewDidAppear 并移入其自己的专用函数中。
  3. 通过fetchDataFromDatabase成功部分中的 NSNotificationCenter 调用此函数(通过此通知范例,您将在fetchDataFromDatabase函数中"触发"通知,您的 viewController 将"侦听"此通知并做出相应的响应(在本例中,通过在视图中对数据进行动画处理和呈现"((

我会设置视图的默认状态以显示加载过程(中间有UIActivityIndicatorView的空视图是我所说的最简单的例子(。这样可以确保用户了解应用在处理提取方法时不会冻结。然后,我将通过将UIView.animate方法移动到其末尾来修改downloadCompleted方法。这意味着只有在获取过程完成后才会执行任何 UI 更新。

您的问题是,由于机制的异步性质,viewDidAppear可能会在获取完成之前被调用。

最新更新