2015-09-20 2 views
0

Je dois tirer pour rafraîchir fonctionnant bien, sauf lorsque la table recharge il ya un délai de fraction de seconde avant que les données dans la table se recharge.Tirer pour rafraîchir: l'actualisation des données est retardée

Est-ce que j'ai juste une petite chose qui ne va pas? Des idées?

viewDidLoad:

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

handleRefresh pour Pull à Actualiser:

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

besoin des données en deux endroits, donc créé une fonction pour elle 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

Vous ne devez pas appeler 'endRefreshing' avant d'appeler' reloadData' dans le bloc d'envoi – Paulw11

+0

@ Paulw11 Merci pour la réponse! Je pense que cela a du sens maintenant. Mais comment ferais-je cela dans le code que j'ai, parce que je ne voudrais pas mettre 'endRefreshing' dans ma fonction' getCloudKit' (parce que j'ai juste besoin d'utiliser 'endRefreshing' pour Pull To Refresh pas' viewDidLoad')?)? – SRMR

+1

Vous pouvez appeler endRefreshing indépendamment. Si le contrôle, n'est pas dans l'état de rafraîchissement, il va simplement l'ignorer – Paulw11

Répondre

2

Voici comment vous devriez faire ceci:

  1. Dans votre fonction handleRefresh, ajoutez un bool pour suivre l'opération de rafraîchissement en cours - dire isLoading.
  2. Dans votre fonction getCloudKit juste avant de recharger la vue de table appelez la fonction endRefreshing si isLoading était vrai.
  3. Réinitialisez isLoading à false. Important: ne supprimez pas les données de votre modèle avant même que l'opération d'actualisation ne soit instanciée. Que faire s'il y a une erreur dans la récupération des données? Supprimez-le uniquement après avoir reçu la réponse dans la fonction getCloudKit. En outre, en guise de remarque, j'implémenterais une approche basée sur l'horodatage pour passer mon dernier horodatage des données de service (heure à laquelle la dernière mise à jour a été prise depuis le serveur) vers le serveur et le côté serveur. données complètes seulement il y avait des changements après cet horodatage sinon je m'attendrais à ce qu'ils me disent pas de changement. Dans un tel cas, je voudrais simplement appeler endRefreshing fonction et ne rechargerait pas les données sur la table. Croyez-moi - cela économise beaucoup et donne une bonne expérience utilisateur car la plupart du temps il n'y a pas de changement dans les données!