2017-11-13 4 views
0

タイトルには私のアプリに問題があると言われています。アプリはメインメニューをロードiOSでアニメーションを表示する前にネットワークタイムアウトを正しく設定するにはどうすればよいですか?

  • ダウンロードを表示するには、いくつかの製品がありますかどうかを確認するために、firebaseに接続します。私は箇条書きを使用して達成しようとしているものを詳細にもう少し説明しましょう製品画像
  • は、製品情報および画像

を示すために、私は接続がうまくいかないケースを処理するための関数を作成したり、製品が存在していないコンテンツをアニメーション化。問題は、接続が遅すぎてアニメーションが開始する前に画像をロードできない(約2秒間)場合です。この場合、アプリがちょっと立ち往生し、アニメーションが終了する前に商品が表示されます。私の目的は、私が応答を持っていたら、アニメーションを起動することです

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) 
     } 
    } 
} 

ロードコード

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: { 
      ... 
    } 
} 

製品イメージをダウンロードするためのコードを表示さダウンロード状態から、または接続に2秒以上かかってイメージがダウンロードされるためです。何かアドバイス?

答えて

0

FireBaseからの応答があるかどうかにかかわらず、viewDidAppearのコードは起動します。あなたはこれを行うための最も単純な方法は以下のようになり

データをロード(またはしない)しているときを知るためにあなたのアプリケーションを許可する必要がある抽象レベルでは

  1. はviewDidAppearの外に、独自の専用機能にあなたのビューのアニメーションコードを移動し
  2. 製品詳細ページ(here is an example of Facebooks version of it, see the first gif
  3. のための「スケルトン」テンプレートを持っています。
  4. fetchDataFromDatabaseの成功部分の内側NSNotificationCenterを経由してこの関数を呼び出し(この通知パラダイムを経由して、あなたは「火」あなたのfetchDataFromDatabase機能で通知し、あなたのViewControllerは、このインスタンスに(従って、この通知のために、「聞く」と応答します、
0

ローディングプロセスを表示するようにビューのデフォルト状態を設定します(UIActivityIndicatorViewが中央に表示された空のビューは、私が話していることの最も単純な例です)。 )これにより、fetchメソッドの処理中にアプリがフリーズしていないことをユーザーが理解できるようになります。 次に、downloadCompletedメソッドを変更しますUIView.animateメソッドをその最後に移動します。これは、取得プロセスが完了した後にのみUI更新が実行されることを意味します。

メカニズムの非同期性のためにフェッチが完了する前にviewDidAppearが呼び出される可能性があります。

関連する問題