2012-02-29 3 views
0

J'ai une application qui a beaucoup de vues (en utilisant le contrôleur de barre d'onglets). Je souhaite créer des requêtes HTTP asynchrones simultanées, indépendamment de la vue actuelle que l'utilisateur consulte. Quand une demande http est répondue, je veux mettre à jour l'interface utilisateur, puis demander à nouveau. Si j'écris le code dans une sous-classe UIViewController, tout fonctionne correctement. Où puis-je écrire mon code pour pouvoir travailler, sans savoir quel onglet est affiché par l'utilisateur? Je voudrais éviter d'utiliser des discussions. Est-ce possible?Requêtes HTTP asynchrones multiples en arrière-plan iPhone

J'ai créé un service web qui prend des requêtes http et répond quand il a quelque chose de nouveau. Alors, je demande la nouvelle information puis je rouvre la fenêtre pour que le webservice me parle. De cette façon, je fais une connexion "persistante".

Enfin, je voudrais savoir, quelle est la meilleure façon d'informer mon modèle pour les changements qui seront apportés à celui-ci. NSNotification? Délégation?

MISE À JOUR

Le code ci-dessous ne reçoit aucune réponse. Il reçoit BAD_ACCESS et il se bloque.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    // Override point for customization after application launch. 
    // Request Data 
    ConnectionHandler *connectionHandler = [[ConnectionHandler alloc] init]; 
    [connectionHandler requestSO]; 
    [connectionHandler requestSopen]; 
    // Make Root View Controller 
    MainViewController *mainViewcontroller = [[MainViewController alloc] initWithNibName:@"MainViewController" bundle:nil]; 
    [self.window setRootViewController:mainViewcontroller]; 
    // 
    self.window.backgroundColor = [UIColor whiteColor]; 
    [self.window makeKeyAndVisible]; 
    return YES; 
} 

Répondre

0

Il est faux d'éviter les threads, mais si vous voulez exécuter tous les processus à partir d'un emplacement central, appDelegate est peut-être un endroit où vous pouvez le faire. Personnellement, je ferais toutes les demandes de réseau à l'intérieur du modèle.

+0

Pourquoi est-il mauvais d'éviter les threads? –

+2

L'exécution de vos demandes dans un thread d'arrière-plan distinct (hors du thread principal) permet de maintenir l'interface utilisateur de votre application sensible. Si votre interface utilisateur ne répond pas du fait de l'exécution de tous les processus sur le thread principal, votre application risque d'être détruite par le système d'exploitation, et au moins vos utilisateurs l'évalueront très mal. Voir http://www.raywenderlich.com/4295/multithreading-and-grand-central-dispatch-on-ios-for-beginners-tutorial – ader

2

NSURLConnection est par défaut async sauf si vous appelez manuellement sendSynchronousRequest: returningResponse: erreur:, faire une classe NSURLConnectionDelegate, définissez cette classe en tant que délégué de votre modèle et l'utiliser pour mettre à jour votre interface utilisateur.

+0

Où devrais-je déclencher la requête http? J'ai besoin que ce code soit exécuté tout le temps. Je ne sais pas quel écran sera affiché par l'utilisateur –

+1

Utiliser un thread d'arrière-plan ... Ainsi, vous pouvez continuer à envoyer des requêtes indépendamment de ce qui est exécuté sur le thread principal. – Prathiba

+0

Je souhaite éviter les threads. Y a-t-il un moyen plus sûr de le faire? –