2017-01-17 2 views
0

Почему, когда я добавляю новые данные в базу данных firebase, дублируется в моем приложении, но когда я вытягиваю, чтобы обновить его обратно, а не дублировать, я поместите снимок экрана о том, как данные отображаются в моем симуляторе проекта. Это то, как данные появляются в моем проекте. 1Новые добавленные данные в базе данных firebase дублируют его сам, прежде чем тянуть, чтобы обновить с помощью Swift3

Это мой код.

import UIKit 
import FirebaseDatabase 
import SDWebImage 
import FirebaseAuth 


class ViewController: UIViewController , UITableViewDataSource , UITableViewDelegate { 


@IBOutlet weak var tableView: UITableView! 

var Ref:FIRDatabaseReference? 

var Handle:FIRDatabaseHandle? 

var myarray = [Posts]() 

var refresh = UIRefreshControl() 

    override func viewDidLoad() { 
    super.viewDidLoad() 

    tableView.delegate = self 
    tableView.dataSource = self 

    refresh.addTarget(self, action: #selector(ViewController.loadData), for: .valueChanged) 

    tableView.addSubview(refresh) 


} 

override func viewDidAppear(_ animated: Bool) { 

    loadData() 

    } 



func loadData(){ 

    self.myarray.removeAll() 

    Ref=FIRDatabase.database().reference() 

    Handle = Ref?.child("Posts").queryOrdered(byChild: "Des").queryEqual(toValue: "11").observe(.childAdded ,with: { (snapshot) in 

     if let post = snapshot.value as? [String : AnyObject]{ 

      let img = Posts() 

      img.setValuesForKeys(post) 

      self.myarray.append(img) 

      print("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\(img)") 

      self.tableView.reloadData() 
     } 


    }) 
     self.refresh.endRefreshing() 

} 
+0

Можете ли вы показать код, в котором вы добавляете сообщение? –

+0

Я добавляю его непосредственно из консоли базы данных. –

+0

Вы пытались использовать '.value' вместо' .childAdded'? –

ответ

1

Появляется self.refresh.endRefreshing() вызывается вне закрытия Firebase.

Это плохо, поскольку этот код будет запущен до того, как Firebase вернет данные и перезагрузит данные tableView.

Помните, что Firebase является асинхронным, и для получения данных с сервера Firebase требуется время, чтобы он мог работать с кодом Firebase перед кодом в закрытии.

Кроме того, ручка не используется в этом случае, если вы не используете ее в другом месте.

Ref?.child("Posts").queryOrdered(byChild: "Des").queryEqual(toValue: "11") 
        .observe(.childAdded ,with: { (snapshot) in 
    if let post = snapshot.value as? [String : AnyObject]{ 
     let img = Posts() 
     img.setValuesForKeys(post) 
     self.myarray.append(img) 
     print("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\(img)") 
     self.tableView.reloadData() 
    } 
    self.refresh.endRefreshing() 
}) 

Кроме того, вы можете рассмотреть только удаление освежающей полностью, как при добавлении наблюдателя в Firebase узла (.childAdded) каждый раз, когда ребенок добавил он, ваш TableView будет автоматически обновляться из-за код, выполняемым в закрытие.

+0

Спасибо за помощь, но я не хочу удалять обновление из моего проекта, и я делаю это как ваш ответ, но все же одни и те же данные об ошибках дублируются. –

+0

@ ZaidMustafa Почему вы используете освежение в этом случае? Когда вы вызываете tableView.reloadData, tableView обновляется. Возможно, ошибка в методах делегата tableView? Можете ли вы добавить их к вопросу? – Jay

+0

@Jay у меня такая же проблема, но когда я удаляю ее дубликат добавив работу хорошо – Muhammed

Смежные вопросы