130 votes

NSDefaultRunLoopMode vs NSRunLoopCommonModes

Chers gens de bien de stackoverflow,

Tout comme la dernière fois, je vous amène une question j'ai récemment chute. J'espère que quelqu'un pourrait jeter un peu de lumière sur moi.

Chaque fois que j'essaie de télécharger un gros fichier, derrière le scrollview, mkmapview ou quelque chose, le téléchargement est interrompu dès que je touche écran de l'iPhone. Heureusement, un super blog par Jörn suggère une autre option, à l'aide de NSRunLoopCommonModes pour la connexion.

Que me regarder dans le détail des deux modes, NSDefaultRunLoopMode et NSRunLoopCommonModes, mais le document apple ne fait pas de m'expliquer, autre que de dire

NSDefaultRunLoopMode

Le mode de traiter avec l'apport d'autres sources que NSConnection objets. C'est le plus couramment utilisé de l'exécution de la boucle de mode.

NSRunLoopCommonModes

Les objets ajoutés à une course en boucle à l'aide de cette valeur que la mode sont suivis par tous les exécuter en boucle les modes qui ont été déclarées comme un membre de l'ensemble de la "commune" modes; voir la description de CFRunLoopAddCommonMode pour plus de détails.

CFRunLoopAddCommonMode

Des Sources, des minuteries et des observateurs être enregistré pour un ou plusieurs modes de boucle uniquement lorsque l'exécution de la boucle est exécuté dans l'un de ces modes. Les modes normaux sont un ensemble d'exécuter des modes de boucle pour lesquelles vous pouvez définir un ensemble de sources, des minuteries et des observateurs qui sont partagés par ces modes de transport. Au lieu d'enregistrer une source, par exemple, à chaque exécution de la boucle de la mode, vous pouvez l'enregistrer une fois à la course de la boucle de la commune de la pseudo-mode et il sera automatiquement enregistré dans chaque exécution de la boucle de mode dans le mode de commun ensemble. De même, lorsqu'un mode est ajouté à l'ensemble de la commune de modes, de toutes les sources, des minuteries ou des observateurs déjà inscrits pour la commune de la pseudo-mode sont ajoutés à la nouvelle mode commun.

Quelqu'un peut-il expliquer les deux dans le langage humain?

218voto

viggio24 Points 8077

Une course en boucle est un mécanisme qui prévoit la possibilité pour le système de se réveiller du sommeil de threads pour gérer les événements asynchrones. Normalement, lorsque vous exécutez un fil (à l'exception du thread principal), vous avez la possibilité de démarrer pour une course en boucle ou pas. Si le thread n'est en quelque sorte ou de longue enflammée opération, sans interaction avec les événements extérieurs et pas de compteurs à zéro, vous n'avez pas besoin d'une course en boucle, mais si votre fils a besoin pour répondre aux événements entrants, vous avez besoin de l'attacher à une course en boucle afin de réveiller ce fil lorsque de nouveaux événements arrivent. C'est le cas de l' NSURLConnection généré fils, comme le live sur les événements entrants uniquement (à partir du réseau).

Chaque thread peut être associé à différents exécuter des boucles, ou il peut être associé à une course en boucle, mais cette exécution de la boucle peut être configuré pour fonctionner sur différents modes. Un "run mode loop" est une convention utilisée par le système d'exploitation afin d'établir quelques règles lors de la livraison de certains événements ou tout simplement de suspendre la livraison et ensuite de recueillir tous pour être livré plus tard. Généralement, toutes les exécuter en boucle sont définies à la "mode par défaut", qui établit un défaut façon de gérer les événements d'entrée. Dès que certains de la souris enfoncée (Mac OS) ou tactile (sur iOS) de l'événement se produit, le mode d'exécution de la boucle est définie pour le suivi des événements: cela signifie que le fil ne sera pas réveillé le nouveau réseau d'événements, mais ces événements seront livrés plus tard lors de la saisie de l'utilisateur de l'événement se termine et l'exécution de la boucle de jeu en mode par défaut de nouveau: c'est évidemment un choix fait par le système d'exploitation architectes de donner la priorité aux événements de l'utilisateur au lieu de l'arrière-plan des événements.

Si vous décidez de modifier la course de la boucle de mode pour votre NSURLConnection fil, à l'aide de la

scheduleInRunLoop:forModes:

méthode, puis vous laissez le fil des événements pour être associés à une exécution en boucle (par défaut) mais dans une autre exécution de la boucle de mode. En particuliers des pseudo-mode appelé "commun" permet d'associer de façon permanente les sources d'entrée à tous les modes qui sont - ou seront associées à la "mode commun". Bien sûr, l'événement mode de suivi fait partie de cette famille de modes, de sorte que la méthode appliquée sur NSURLConnections'instance signifie: veuillez associer la connexion de la source d'événements "en mode de suivi" en plus de "mode par défaut".

Enfin, vous pouvez ajouter de nouveaux modes pour le commun des modes, mais c'est un assez bas niveau de fonctionnement.

Je voudrais terminer en ajoutant quelques notes:

  • généralement, nous devons associer à une vue de la table d'un ensemble d'images ou de les vignettes téléchargés à partir du réseau; même si on peut penser que, télécharger des images à partir du réseau lors de l'affichage de la table est défilement pourrait améliorer l'INTERFACE utilisateur (parce que nous pouvons voir les images lors de la défilement) enfait c'est dangereux que l'effet final sera un défilement pas fluide. Donc, ne pas ajouter d' NSURLConnection de la course de la boucle dans de tels cas, mais l'utilisation de l' UIScrollView délégué méthodes pour détecter le moment où le défilement est mis fin à la mise à jour de la table et de télécharger de nouveaux éléments à partir du réseau;

  • vous pouvez envisager d'utiliser le PGCD qui vous aideront à "bouclier" de votre code de la course de la boucle de gestion des problèmes. Ainsi dans l'exemple ci-dessus, vous pouvez envisager d'ajouter vos demandes de réseau à une série de file d'attente.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X