Ios UITableView为空,具有后台调用

Ios UITableView为空,具有后台调用,ios,swift,uitableview,Ios,Swift,Uitableview,所以我有以下问题,我在谷歌上搜索并在一定程度上玩过。 我有一个tableView,我可以向它添加对象并正确填充它,但当我替换后端调用(通过外部库进行调用,非常希望保持简单)时,表将变空。我可以看到这个电话是在渲染后打的,所以不知道你是否能帮忙 class FindBuddiesViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { @IBOutlet weak var ta

所以我有以下问题,我在谷歌上搜索并在一定程度上玩过。 我有一个tableView,我可以向它添加对象并正确填充它,但当我替换后端调用(通过外部库进行调用,非常希望保持简单)时,表将变空。我可以看到这个电话是在渲染后打的,所以不知道你是否能帮忙

    class FindBuddiesViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {



    @IBOutlet weak var tableView: UITableView!
    var objects: NSMutableArray! = NSMutableArray()
    var users:[AppUser] = []

    override func viewDidLoad() {
        super.viewDidLoad()
        self.tableView.delegate = self
        self.tableView.dataSource = self

       //populates the array users from Firebase
        users = DBHelper.getAllRelatedUsersForVid("1234")
        populateTable(users)


    }

    func populateTable(users: [AppUser]) -> Void {
        for element in users {
            let appUser: AppUser = AppUser(id: element.id, displayName: element.displayName, email: element.email, profileImageURL: element.profileImageURL, following: element.following, follower: element.follower)
            print(appUser.displayName)
            self.objects.addObject(appUser)
            print("count of dbusers: \(users.count)")
            self.tableView.reloadData()
            doTableRefresh()
        }

    }


    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.objects.count
    }

    func doTableRefresh()
    {
        dispatch_async(dispatch_get_main_queue(), {
            self.tableView.reloadData()
            return
        })

    }

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = self.tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! TableViewCell
        let user = self.objects.objectAtIndex(indexPath.row) as! AppUser
        cell.titleLabel.text = user.displayName
        cell.followButton.tag = indexPath.row
        return cell
    }

    func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
        if indexPath.row+1 == objects.count {
            print("came to last row")
            self.tableView.reloadData()
        }
    }

    func tableView(tableView: UITableView, didDeselectRowAtIndexPath indexPath: NSIndexPath) {
        self.performSegueWithIdentifier("showView", sender: self)
    }

    @IBAction func logAction(sender:UIButton)
    {
        let titleString = self.objects.objectAtIndex(sender.tag) as? String
        let firstActivityItem = "\(titleString)"
        let activityViewController:UIActivityViewController = UIActivityViewController(activityItems: [firstActivityItem], applicationActivities: nil)
        self.presentViewController(activityViewController, animated: true, completion: nil)

    }
}
静态方法如下所示 静态函数getAllRelatedUsersForVid(vid:String!)->[AppUser] { var users=AppUser

    // Get a reference to our posts
    let ref = Firebase(url:"https://firebaseProject.firebaseio.com/users")
    // Attach a closure to read the data at our posts reference
    ref.observeEventType(.Value, withBlock: { snapshot in


        let enumerator = snapshot.children
        while let rest = enumerator.nextObject() as? FDataSnapshot 

            let appUser: AppUser = AppUser(id: String(rest.value.valueForKey("uid")), displayName: String(rest.value.valueForKey("displayName")), email: String(rest.value.valueForKey("email")), profileImageURL: String(rest.value.valueForKey("profileImageURL")), following: false, follower: false)
            users.append(appUser)
            print("finished user count \(users.count)")

        }

        }, withCancelBlock: { error in
            print(error.description)
    })

           return users
}

因此,如果我手动创建用户对象并将其附加到对象中,它会工作得非常好,我会在tableView上看到它们。但当我添加调用时,它不会。知道为什么吗?我如何让tableView等待调用。请记住,我无法更改此行users=DBHelper.getAllRelatedUsersForVid(“1234”)这是DBHelper上的一个静态方法。举一个例子,我们非常感谢您在没有真正运气的情况下使用它。

您的问题在于您的
getAllRelatedUsersForVid
。现在,它将始终返回一个空的
users
数组,这就是它没有显示任何内容的原因。此调用是异步的,因此您可以一旦Firebase调用被激发,需要使用闭包回调

我建议像这样将闭包传递回去:

func getAllRelatedUsersForVid(string: String, completion: [AppUser] -> Void) {
    ...
    // This is async
    let ref = Firebase(url:"https://firebaseProject.firebaseio.com/users")
    ref.observeEventType(.Value, withBlock: { snapshot in
        let enumerator = snapshot.children
        while let rest = enumerator.nextObject() as? FDataSnapshot

        let appUser: AppUser = AppUser(id: String(rest.value.valueForKey("uid")), displayName: String(rest.value.valueForKey("displayName")), email: String(rest.value.valueForKey("email")), profileImageURL: String(rest.value.valueForKey("profileImageURL")), following: false, follower: false)
        users.append(appUser)

        // Call completion
        completion(users)
    }
    ...

}
您的viewDidLoad将类似于:

override func viewDidLoad() {
    super.viewDidLoad()
    self.tableView.delegate = self
    self.tableView.dataSource = self

    DBHelper.getAllRelatedUsersForVid("1234") { users in
        populateTable(users)
    }
}

你发布了一堆代码。你说的是什么后端调用?将我们引向代码行,告诉我们它在工作时和不工作时是如何读取的。你能展示一下
getAllRelatedUsersForVid
的实现吗?你说的是函数
DBHelper.getAllRelatedUsersForVid
?这是从网络?还是一个异步调用?通常异步API有一种方法在完成后通知您:或者您将自己设置为委托人,或者提供一个完成块,在操作完成后调用该块。@user2091936不要在注释中发布代码。编辑您的原始问题。更新代码以确保它具有getAllRelatedUsersForV按要求出示身份证是的,你说得对!这肯定解决了问题。非常感谢。