2017-07-27 4 views
0

私はIOSと迅速に新しいです。私は活動インジケーターを表示する際に問題が残っています。関数が完全に実行されるまでアクティビティインジケータビューを表示する方法は?

// In the controller 
DispatchQueue.global(qos: .background).async { 
     DispatchQueue.main.async { 
      self.activityIndicator.startAnimating() 

     } 

     Sync.performSync() 
     DispatchQueue.main.async { 
      self.activityIndicator.stopAnimating() 

     } 

    } 


class Sync { 
    static func performSync() { 
    User.performUserSync() 
    ItemBarcode.performIbSync() 
    // few more sync functions 
    } 
} 

class User { 
    static func performUserSync(){ 
     Alamofire.request("\(baseUrl)/api/users", method: .get, headers: 
     headers).responseJSON { response in 
     // Fetch code and insert to database 
     } 
    } 
} 

アクティビティインジケータビューは1-2秒後に表示され、消えてしまうという問題があります。しかし、Sync.performSync()関数全体が実行されるまで表示させておいてください。時間がかかるでしょう。どのように私はそれをコード化するのですか?

答えて

2

performUserSyncで実行するネットワーク要求が非同期要求であるため、performUserSyncも非同期機能になります。つまり、実行を終了する前に戻ります。

あなたはこの問題を解決するために、いくつかの方法があります:

  1. のみperformUserSync中にあなたAlamofire要求の完了ハンドラ内activityIndicator.stopAnimating()を呼び出します。
  2. performUserSyncとそれを呼び出すすべての関数が完了ハンドラを返し、返された完了ハンドラ内のアクティビティインジケータを停止するように変更します。
  3. PromiseKitなどのフレームワークを使用して、戻り値を持つ通常の関数のような非同期関数を処理します。
関連する問題