2015-09-20 3 views
0

У меня есть Pull to Refresh, работающий отлично, за исключением случаев, когда таблица перезагружается, есть разделенная вторая задержка до перезагрузки данных в таблице.Pull to Refresh: обновление данных задерживается

Есть ли у меня какая-то маленькая вещь? Есть идеи?

viewDidLoad:

override func viewDidLoad() { 
    super.viewDidLoad() 
    self.refreshControl?.addTarget(self, action: "handleRefresh:", forControlEvents: UIControlEvents.ValueChanged) 
    self.getCloudKit() 
} 

handleRefresh для Прицепные Обновлять:

func handleRefresh(refreshControl: UIRefreshControl) {  
    self.objects.removeAll() 
    self.getCloudKit() 
    dispatch_async(dispatch_get_main_queue(), {() -> Void in 
     refreshControl.endRefreshing() 
    }) 
} 

нужны данные в двух местах, так что создали функцию для него getCloudKit:

func getCloudKit() { 
    publicData.performQuery(query, inZoneWithID: nil) { results, error in 
     if error == nil { // There is no error 
      for play in results! { 
       let newPlay = Play() 
       newPlay.color = play["Color"] as! String 
       self.objects.append(newPlay) 
      } 

      dispatch_async(dispatch_get_main_queue(), {() -> Void in 
       self.tableView.reloadData() 
      }) 

     } else { 
      print(error) 
     } 
    } 
} 

tableView:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier("reuseIdentifier", forIndexPath: indexPath) 
    let object = objects[indexPath.row] 
    if let label = cell.textLabel{ 
     label.text = object.matchup 
    } 
    return cell 
} 
+0

Вы не должны называть 'endRefreshing' до того, как вы назовете' reloadData' в блоке отправки – Paulw11

+0

@ Paulw11 Спасибо за ответ! Думаю, теперь это имеет смысл. Но как бы я это сделал в коде, который у меня есть, потому что я не хотел бы правильно «endRefreshing» в моей функции getCloudKit' (потому что мне нужно использовать 'endRefreshing' для Pull To Refresh, а не' viewDidLoad'?)? – SRMR

+1

Вы можете вызвать endRefreshing независимо. Если элемент управления не находится в состоянии refreshingg, он просто проигнорирует его. – Paulw11

ответ

2

Это, как вы должны сделать это:

  1. В вашей handleRefresh функции, добавить логическое значение для отслеживания операции обновления в процессе - говорят isLoading.
  2. В вашей функции getCloudKit непосредственно перед перезагрузкой вызова в виде таблицы endRefreshing функция, если isLoading был правдой.
  3. Сброс isLoading до false.
  4. Важно: не удаляйте данные модели до того, как операция обновления не будет создана. Что делать, если есть ошибка в получении данных? Удалите его только после получения ответа обратно в функции getCloudKit.
  5. Кроме того, в качестве побочного примечания, если бы я хотел, я бы применил подход на основе временной метки, в котором я бы передал свою последнюю временную метку данных службы (время, когда последнее обновление было взято с сервера), на сервер и серверную сторону вернет меня полные данные только были изменения, опубликованные в этой временной отметке, иначе я бы ожидал, что они не скажут мне никаких изменений. В таком случае я бы просто вызвал функцию endRefreshing и не перезагружал данные на таблицу. Поверьте мне - это экономит много и дает хороший конечный пользовательский опыт, так как в большинстве случаев нет изменений в данных!