代码之家  ›  专栏  ›  技术社区  ›  user3582537

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

  •  0
  • user3582537  · 技术社区  · 8 年前

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

    • 该应用程序加载主要的menù并连接到firebase,以查看是否有一些产品要展示
    • 下载产品图片
    • 为内容设置动画,以显示产品信息和图像

    负荷代码

    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秒以上才能下载图像,启动动画。有什么建议吗?

    2 回复  |  直到 8 年前
        1
  •  0
  •   user3078856 user3078856    8 年前

    无论您是否收到FireBase的响应,viewDidAppear中的代码都会触发。

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

    最简单的方法是;

    1. 为产品详细信息页面提供“框架”模板( here is an example of Facebooks version of it, see the first gif )
    2. NSNotificationCenter fetchDataFromDatabase (通过此通知范例,您将在 从数据库获取数据 函数,您的viewController将“侦听”此通知并相应地做出响应(在本例中,通过在视图中设置动画并显示数据)
        2
  •  0
  •   Igor Andreev    8 年前

    UIActivityIndicatorView 中间是我所说的最简单的例子)。这可以确保用户理解在处理获取方法时应用程序不会被冻结。 downloadCompleted 移动方法 UIView.animate 方法。这意味着只有在抓取过程完成后才执行任何UI更新。

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