2017-10-18 11 views
1

私のモデルでは、firebaseからデータを読み込む機能があります。 完了したらcompletionHandler(true)を呼び出します。 これは私のコントローラのviewDidLoad関数で、UITableViewControllerを継承しています。 私の完了ハンドラが完了しても、まだtableViewデータを再読み込みできませんでした4

override func viewDidLoad() 
    { 

     super.viewDidLoad() 

     let activityIndicatorView = UIActivityIndicatorView(activityIndicatorStyle: UIActivityIndicatorViewStyle.whiteLarge) 
     tableView.backgroundView = activityIndicatorView 
     self.activityIndicatorView = activityIndicatorView 
     activityIndicatorView.startAnimating() 

     model.readInFirebaseData { (success) in 

      print("data read in") 
      activityIndicatorView.stopAnimating() 
      dataArray = model.firebaseDataArray 
      self.tableView.reloadData() 

     } 

     searchController.searchResultsUpdater = self 
     searchController.dimsBackgroundDuringPresentation = false 
     tableView.tableHeaderView = searchController.searchBar 

    } 

しかし、テーブルが空と何らかの理由のself.tableView.reloadDataのために残っている()は、私が好きなテーブルに移入されていませんが、私はTableViewControllerからセグエとリストを戻ってきた場合に移入されます。

どこが間違っているのか正確にはわかりません。

ありがとうございました。

更新:


私はまだそれは私がデリゲートを使用completionHandlerのように代わりに働いて得ることができませんでした。私がやったことだった。

シングルトン:

protocol Refresh{ 
    func refreshData() 

    } 

    var delegate:Refresh? 


func readInFirebaseData() 
{ 

    self.ref.child("users").observe(DataEventType.childAdded, with: { (snapshot) in 

     user.name = value?["name"] as? String ?? "" 
     self.dict.updateValue(user, forKey: uid) 

     DispatchQueue.main.async { 

      self.delegate?.refreshData() 
      print("main thread dispatch") 

     } 

    })  

} 

TableViewController:すべての作品

class ListController: TableViewController, Refresh{ 

viewDidLoad() 
{ 
    model.delegate = self 
} 

func refreshData() { 
     print("called") 
     array = model.array 
     self.tableView.reloadData() 
    } 

。本当に私が答えを知らない唯一の問題は、DispatchQueue.main.asyncが毎回firebaseが "user"で読み込まれることです。しかし、私はそれをreadInFirebase関数の最後に置き、何もリストに入れられませんでした。しかし、いずれにしても、現時点では機能します。

+0

テーブルビューを設定するコードを表示できますか? – Wez

+0

ちょっと@Wez。クラスがListControllerクラスとして定義されるように、私はUITableViewControllerを拡張しています:UITableViewController、UISearchResultsUpdating。 – Mike

+0

あなたのUITableViewDelegateとUITableViewDataSourceはどこにありますか? – Wez

答えて

5

おそらくreadInFirebaseDataメソッドは非同期であり、コールバックはメインのスレッドとは異なるスレッドで実行されます。

すべてのUIKit関連のコールは、をメインスレッドで実行する必要があります。

で試してみてください:

model.readInFirebaseData { (success) in 
    print("data read in") 
    dataArray = model.firebaseDataArray 

    DispatchQueue.main.async { 
     activityIndicatorView.stopAnimating() 
     self.tableView.reloadData() 
    } 
} 
+0

私の投稿を更新しました。最後にデリゲートを使用しました。 – Mike

1

は、デリゲートとデータソースを設定してください:

tableView.delegate = self 
tableView.dataSource = self 

そして、あなたはメインスレッドからreloadData()を呼び出すことを確認してください。

背景から、それを呼び出す
DispatchQueue.main.async { 
    self.tableView.reloadData() 
} 

この操作はUI関連であるため、スレッドは通常、テーブルをリロードすることはありません。どのUI関連操作もメインスレッドから実行する必要があります。

関連する問題