Swift字符串数组一直显示为空

时间:2016-05-06 20:55:09

标签: arrays swift

我有一个函数将连接到我的解析数据库并遍历所有用户对象,并将其名称和电子邮件附加到每个类别的字符串数组中。

当我调试它时,它会在viewWillAppear函数中将数组显示为具有正确的值,但是当它返回到返回数组中的行数时,由于某种原因它们是空的。

知道造成这种情况的原因是什么?

这是我的代码

 import UIKit
 import Parse

class ContactTableViewController: UITableViewController {

//arrays to hold user's name and email
var users_names = [String]()
var users_emails = [String]()


override func viewWillAppear(animated: Bool){

    //Load user email and name
    let query: PFQuery = PFUser.query()!

    query.findObjectsInBackgroundWithBlock {
        (objects:[PFObject]?, error:NSError?) -> Void in
        if error == nil {
            // The find succeeded.
            print("Successfully retrieved \(objects!.count) users.")
            // Do something with the found objects
            if let user_objects = objects {
                for user in user_objects {
                    self.users_names.append(user.valueForKey("name") as! String)
                    self.users_emails.append(user.valueForKey("email") as! String)
                }
            }
        } else {
            // Log details of the failure
            print("Error: \(error!) \(error!.userInfo)")
        }
        self.users_names.removeAtIndex(1)
        self.users_emails.removeAtIndex(1)
        self.tableView.reloadData()
    }
}

override func viewDidLoad() {
    super.viewDidLoad()
    view.backgroundColor = UIColor(red: 0.8353, green: 0.9098, blue: 0.902, alpha: 1.0)
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}



// MARK: - Table view data source

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return 1
}

//return number of rows in table
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return users_names.count
}

问题是cellForRowAtIndexPath正在运行并在viewWillAppear()运行之前填充表并将数据提取到数组中。

我尝试在viewWillAppear

的开头添加它
UIApplication.sharedApplication().beginIgnoringInteractionEvents()

然后.endIgnoringInteractionEvents()在viewWillAppear的末尾但是没有修复它。

1 个答案:

答案 0 :(得分:2)

您正在通过后台线程运行的块中调用self.tableView.reloadData()。所有与UI相关的操作都必须在主线程上运行。尝试将调用包装为重新加载,如下所示:

self.users_names.removeAtIndex(1)
self.users_emails.removeAtIndex(1)
dispatch_async(dispatch_get_main_queue()) { 
    self.tableView.reloadData()
}