Использование синтаксического анализа для извлечения и отображения объекта пользователя в табличном представлении, но табличное представление не будет обновляться

Вот мой код в быстром

class UserViewController: UITableViewController {

var userArray: [String] = []

@IBOutlet weak var friendListTableView: UITableView!
override func viewDidLoad() {
    super.viewDidLoad()

       retrieveMessages()
       self.friendListTableView.reloadData()


   }
func retrieveMessages() {
    var query = PFUser.query()
    if let username = PFUser.currentUser().username {
        query.whereKey("username", equalTo: username)
            query.findObjectsInBackgroundWithBlock {
        (objects, error) -> Void in

        for object in objects! {
            let usernames:String? = (object as PFObject)["Friends"] as? String
            if usernames != nil {
                self.userArray.append(usernames!)
            }
        }

    }

}
}
            override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

// MARK: - Table view data source

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    // #warning Potentially incomplete method implementation.
    // Return the number of sections.
    return 1
}

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // #warning Incomplete method implementation.
    // Return the number of rows in the section.
    return userArray.count
}


override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    // Update - replace as with as!

    let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as UITableViewCell

    cell.textLabel?.text = userArray[indexPath.row]


    return cell
}

Мой UITableView не обновляется. Я изменил расположение self.friendListTableView.reloadData() внутри функции retrieveMessage внутри метода viewDidLoad, а таблица по-прежнему пуста. Я считаю, что мой метод в retrieveMessage() как-то неверен, возможно, внутри for object in objects { ... }.

Вот скриншот моего класса «Пользователь» в разборе https://www.dropbox.com/s/6xp48v3yn0l2hje/Screen%20Shot%202015-06-03%20at%202.10.13%20PM.png?dl=0
и вот моя таблица отношений текущего пользователя, сохраненная методом PFRelation https://www.dropbox.com/s/pd8mt8sf35u1m0v/Screen%20Shot%202015-06-03%20at%202.10.55%20PM.png?dl= 0

Любая помощь приветствуется и дайте мне знать, если вам нужна дополнительная информация. Спасибо


person sin90    schedule 05.06.2015    source источник


Ответы (3)


Похоже, вы забыли вызвать reloadData в своей таблице после заполнения массива.

После этого:

for object in objects! {
   let usernames:String? = (object as PFObject)["Friends"] as? String
   if usernames != nil {
       self.userArray.append(usernames!)
   }
}

Ты нуждаешься в этом:

dispatch_async(dispatch_get_main_queue()) {
    self.friendListTableView.reloadData()
}
person Eric Aya    schedule 05.06.2015
comment
Я пробовал, и это все еще не сработало, табличное представление все еще пусто. Я пробовал почти все здесь, пожалуйста, помогите. - person sin90; 05.06.2015
comment
Действительно ли ваш метод захватывает объекты? Давайте проверим, например, поставив println(usernames) непосредственно перед if usernames != nil; или поставьте точку останова на if usernames != nil и проверьте свойство usernames в отладчике. - person Eric Aya; 05.06.2015
comment
Он говорит ноль, но я уверен, что в учетной записи текущего пользователя есть список друзей, в чем причина? Я как-то неправильно заявил? - person sin90; 05.06.2015
comment
Я попробовал, и теперь он полон ошибок, не совсем уверен, куда идти. Можете ли вы указать мне, что я должен исправить? Спасибо - person sin90; 05.06.2015

1) Вы отметили в раскадровке, что ваш UserViewController является источником данных и делегатом для tableView? я имею в виду следующее: источник данных и делегат для tableView

2) и я думаю, что вы можете пройти перезагрузку tableView здесь:

query.findObjectsInBackgroundWithBlock {
    (objects, error) -> Void in

    for object in objects! {
        let usernames:String? = (object as PFObject)["Friends"] as? String
        if usernames != nil {
            self.userArray.append(usernames!)
        }
    }dispatch_async(dispatch_get_main_queue()) {
friendListTableView.reloadData()

}}

person Kate Belinskaya    schedule 05.06.2015
comment
Это не сработало. Я забыл пометить свой userViewController как источник данных и делегировать, поэтому я сделал это, и у меня есть свой код с вашим кодом, но табличное представление все еще пусто, и я не знаю, почему. Пожалуйста помоги - person sin90; 05.06.2015
comment
ОБНОВЛЕНИЕ: мой метод вообще не захватывает объект, проблема должна быть в том, как я объявляю переменную имен пользователей, но как это исправить? Спасибо - person sin90; 05.06.2015

findObjectsInBackgroundWithBlock работает в фоновом режиме (как следует из названия). Из документации для PFQuery :

Асинхронно находит объекты и вызывает заданный блок с результатами.

Поэтому userArray не будет заполнено к тому времени, когда вы вызовете friendListTableView.reloadData() в viewDidLoad. Согласно Как я могу заполнить UITableView данными из запроса parse.com после того, как он будет запущен в фоновом режиме?, вы должны сделать следующее в retrieveMessages:

//...

for object in objects! {
    // You can shorten the code in your for-loop to:
    if let usernames = (object as PFObject)["Friends"] as? String {
        self.userArray.append(usernames)
    }
}

// Here userArray has been updated so it's a good time to call reloadData().
// (You should always update UI on the main thread)
dispatch_async(dispatch_get_main_queue()) {
    friendListTableView.reloadData()
}

//...

Если вы не знакомы с dispatch_async, я бы порекомендовал вам взглянуть на Разработка приложений для iOS 8 с помощью лекций Swift на iTunesU, есть хорошая лекция о многопоточности.

person ABakerSmith    schedule 05.06.2015
comment
Я делаю именно так, как вы говорите, и это не сработало, вероятно, проблема с переменной имен пользователей, я мог как-то объявить это неправильно, но я не знаю, как это исправить. Я застрял с этой проблемой почти неделю, и я не знаю не знаю что теперь делать. Пожалуйста помоги - person sin90; 05.06.2015
comment
Вы проверили, что userArray содержит что-либо к тому времени, когда вы звоните reloadData? Я бы также проверил, что (object as PFObject)["Friends"] as? String не возвращает nil. - person ABakerSmith; 05.06.2015
comment
ОБНОВЛЕНИЕ: мой метод вообще не захватывает объект, проблема должна быть в том, как я объявляю переменную имен пользователей, но как это исправить? Спасибо - person sin90; 05.06.2015