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