2010-11-28 70 views
7

J'utilise NSURLConnection pour télécharger des ressources de manière asynchrone dans iOS. (Ce sont des fichiers PDF volumineux, donc cela prend du temps avec une connexion lente.)NSURLConnection et multitâche dans iOS

Maintenant, je suis en train de mettre à jour mon application depuis iOS 3 vers iOS 4. Comme mon application ne connaît pas l'emplacement, voip, et la musique de fond, je suppose que je dois faire quelque chose.

Ma question est, alors, ce qui arrive au NSURLConnection en cours d'exécution? Est-il suspendu et magiquement repris lorsque l'application revient au premier plan, ou est-il carrément tué? Si c'est le dernier, quelle est la stratégie standard pour le reprendre automatiquement plus tard? Existe-t-il une sous-classe open-source de NSURLConnection qui le fait automatiquement?

+0

Faites poster vos recherches sur ce sujet, sera utile pour moi et d'autres :) –

Répondre

1

Vous pouvez démarrer une tâche qui durera au maximum 10 minutes. Regardez à l'aide de l'API beginBackgroundTaskWithExpirationHandler: à cette fin. Sachez simplement que si votre tâche prend trop de temps, elle sera détruite par le système d'exploitation.

+0

Cela ne veut pas vraiment répondre à la question ... 'Ma question est, alors, ce qui arrive à la NSURLConnection en cours d'exécution? Est-il suspendu et magiquement repris lorsque l'application revient au premier plan, ou est-il carrément tué? – gcamp

+0

En fait, c'est le cas. Il y a seulement 4 cas où le code * N'IMPORTE QUEL * survit en étant mis en arrière-plan, et ce sont les trois que vous mentionnez, plus celui-ci. Vous devez lancer une tâche d'arrière-plan à un moment donné avant que votre application ne démarre des états de transition, pour garantir que le téléchargement continue à s'exécuter en arrière-plan si l'utilisateur se ferme. Si vous devez annuler la tâche, il existe également une API. – jer

+0

Que devient le 'NSURLConnection' après la reprise de l'application? Est-ce que je reçois le message 'connection: didFail ...:' delegate? – Yuji

1

La connexion NSURLConnection est en effet suspendue et redémarrée lorsque l'application entre au premier plan. Assurez-vous que vous tuez la connexion si l'application se déplace de suspension pour ne pas courir comme si:

- (void)applicationWillTerminate:(UIApplication *)application { 
    if (self.downloadConnection != nil){ 
     [self.downloadConnection cancel]; 
    } 
} 
+0

Uhm, la connexion n'est-elle pas automatiquement supprimée lorsque l'application est terminée? – Yuji

+0

Oui, lorsque l'application est terminée, la connexion est supprimée, mais pas lorsque l'application entre en arrière-plan. – marchinram

+0

Ceci est inutile. 1. Les applications qui utilisent le multitâche (donc toutes les applications d'aujourd'hui) n'utilisent pas la méthode applicationWillTerminate:. 2. Lorsque l'application se ferme, pourquoi auriez-vous besoin d'annuler la demande si elle est annulée et libérée automatiquement est le cycle de vie de l'application se termine ?? 3. NSURLConnections ne doit pas non plus être supprimée lorsque l'application entre en arrière-plan, de sorte que l'approche 'cancel' est erronée dans tous les sens. – JonasG