2010-09-28 19 views
0

tout le monde je suis arrivé problème iciActualisation des données sur iPhone provoque le système instable ou ne répond pas

Je dois mettre à jour des données plist dans une période de temps

et j'utilise la barre d'onglets pour passer 2 vues

Lorsque je sélectionne à View1, il charge les données à partir d'une URL

Mais si je passe à view2, la mise à jour View1 encore les données

Si vous s sorcière de voir2 et de revenir en arrière, view2 continuer à mettre à jour les données.

ce qui est le code que je utilise pour mettre à jour les données dans LoadData.h

@interface LoadData : UITableViewController <NSNetServiceBrowserDelegate> { 
NSArray  *plist; 
NSTimer  *timer; 
} 

dans LoadData.m

static const float REFRESH_STATUS_TIME = 2.0; 
- (void)viewDidLoad { 
timer = [NSTimer scheduledTimerWithTimeInterval:REFRESH_STATUS_TIME 
                target:self 
                selector:@selector(timerFired:) 
                userInfo:nil     
                repeats:YES]; 
[super viewDidLoad]; 
} 
- (void)timerFired:(NSTimer *)theTimer{ 
NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://10.85.28.99/envotouch/req_light.php"] 
cachePolicy:NSURLRequestUseProtocolCachePolicy 
              timeoutInterval:60.0]; 

    NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self]; 
    NSLog(@"\n\nCONNECTION: %@", theConnection); 
    NSData *returnData = [NSURLConnection sendSynchronousRequest:theRequest returningResponse:nil error:nil]; 
    NSString *listFile = [[NSString alloc] initWithData:returnData encoding:NSASCIIStringEncoding]; 
    self.plist = [listFile propertyList]; 

    [self.tableView reloadData] 
} 

Alors ma question est de savoir comment la mise à jour terminée de données quand je passe à une autre vue?

Merci pour la réponse ..... ce un gros bug gênant me

Répondre

2

Si vous utilisez le NSURLConnection asynchrone, vous pouvez envoyer le message d'annulation à la connexion (qui est toujours occupé à charger) lorsque vous basculez vers une autre vue. La méthode asynchrone maintiendra votre interface utilisateur en tant que bonus, ce que la méthode synchrone ne fait pas comme Ole Begemann l'a fait remarquer.

Vous pouvez trouver des informations sur la façon d'utiliser la méthode asynchrone ici: URL Loading System Programming Guide

Edit: Vous devriez probablement arrêter aussi la minuterie (en l'envoyant un message d'invalidation) lorsque la vue n'apparaît pas, de cette façon la minuterie ne se déclenche pas lorsque la vue n'est pas affichée, provoquant le chargement de données.

NSTimer Class Reference

+0

OK ... vous voulez dire que peu importe ce dont j'ai besoin pour arrêter la minuterie quand la vue n'est pas affichée, dois-je supprimer le code non dans ViewDidLoad? Ou donner un autre vide pour mettre à jour mes données toutes les deux secondes ??? –

+0

Vous pouvez démarrer la minuterie dans viewDidAppear et l'arrêter dans viewDidDisappear. –

+0

Je vais essayer et vous dire le résultat –

2

Ne pas utiliser sendSynchronousRequest:returningResponse:error:. Votre programme est complètement bloqué pendant cet appel et peut même être interrompu par le système d'exploitation si le réseau ne répond pas ou si le serveur est arrêté.

Utiliser uniquement NSURLConnection s asynchrone. Vous pouvez leur envoyer un message cancel à tout moment.

+0

Merci pour votre réponse, si je ne veux pas annuler l'action de rafraîchissement, vient de se terminer quand je passe à une autre vue? Et comment utiliser NSURLConnection pour maintenir actualiser les données? –