2015-09-28 1 views
0

У меня есть tableView и segmentControlView, который выполняет другой запрос из базы данных, но я не могу заставить таблицу перезагрузить. Если я вручную перезагружу изменения данных.Swift reloadTableView после queryForTable

override func queryForTable() -> PFQuery { 
     var query:PFQuery = PFQuery(className:"movies") 

    if(objects?.count == 0) 
    { 
     query.cachePolicy = PFCachePolicy.CacheThenNetwork 
    } 
    if self.currentSegmentSelected == 0 { 
     query.whereKey("genres", equalTo:"Action") 
     query.orderByAscending("title") 
    } 
    else if currentSegmentSelected == 1 { 
     query.whereKey("genres", equalTo:"Comedy") 
     query.orderByAscending("title") 
    } 
    else if currentSegmentSelected == 2 { 
     query.whereKey("genres", equalTo:"Crime") 
     query.orderByAscending("title") 
    } 
    return query 
} 

И метод делегата от SegmentControl

func segmentView(segmentView: SMSegmentView, didSelectSegmentAtIndex index: Int) { 
     self.currentSegmentSelected = index 
     queryForTable() 
     self.tableView.reloadData() 
    } 

Редакцией: Если я .findObjectsInThebackground так:

override func queryForTable() -> PFQuery { 
     var query:PFQuery = PFQuery(className:"movies") 
     query.findObjectsInBackgroundWithBlock { (_: [PFObject]?, error:NSError?) -> Void in 
      if error == nil { 

       self.tableView.reloadData() 

      }} 

'NSInternalInconsistencyException', причина: «Этот запрос имеет отличное сетевое соединение. Тебе нужно подождать, пока это не закончится.

+0

не смог получить то, что вы хотите. Вы хотите, чтобы таблица перезагрузилась после чего? – adolfosrs

+0

После выбора сегмента Я хочу перезагрузить таблицу. но я думаю, что таблица перезагружается до завершения запросаForTable. – PoolHallJunkie

+0

Выполнение 'PFQuery' работает асинхронно. Обновите таблицу в блоке после возвращения данных – vadian

ответ

1

Это не достаточно просто сделать запрос, вы должны назвать его где-нибудь:

func segmentView(segmentView: SMSegmentView, didSelectSegmentAtIndex index: Int) { 
    self.currentSegmentSelected = index 
    queryForTable().findObjectsInBackgroundWithBlock { [weak self] objects, error in 
     if error == nil { 
      // Do whatever with `objects` and set it to your data source, whatever you named it. 
      self?.yourDataSourceArray = objects 
      self?.tableView.reloadData() 
     } 
    } 
} 
+0

Значение типа PFQuery не имеет никакого имени. findObjectsInBackgroundWithCompletion – PoolHallJunkie

+0

Извините, что память должна быть немного нечеткой. Это 'backgroundWithBlock' видит мои обновления @PoolHallJunkie – Logan

+0

Вы правы, получается, что queryForTable не асинхронно, поэтому findObjects внутри не работает. Однако даже сейчас таблица не перезагружается ... Я обращаюсь к PFObject из cellForRowAtIndexPath. У меня нет данных, хранящихся локально. – PoolHallJunkie

0

Для подобных работ вы должны использовать query.findObjectsInBackground. Это, вероятно, потребует некоторого рефакторинга в вашем коде, но превратит ваше приложение в гораздо более отзывчивое и удобное для пользователя.

Посмотрите на это video tutorial. Это может помочь.

Код this question должен быть более полезным.

+0

. он ссылался на неправильное видео – adolfosrs

0

Мое решение было неправильным по двум причинам. Сначала queryForTable() не асинхронно, как указал Логан. findObjectsInBackgroundWithBlock должен быть снаружи.

Но, PFQueryTableViewController является классом parse, где self.tableView.reloadData() не работает.

вместо этого, исправление:

self?.loadObjects