2010-12-02 5 views
4

Je veux savoir si les blocs dans c/cacao se déroulent sur un fil séparé du fil principal. Seraient-ils utiles pour exécuter du code coûteux en calcul tout en laissant l'interface utilisateur sensible?blocs et fils

+0

Donc, est la question sur C ou Objective-C? –

+0

Je pense que cela dépendra de la façon dont vous appelez le bloc ... –

+0

@Let_Me_Be Question intéressante ... Techniquement, ils sont implémentés au niveau C mais je ne les ai jamais vu utilisés dans Objective-C. –

Répondre

13

Les blocs ne sont que des fragments de code regroupés dans un objet appelable. La façon dont ils s'exécutent dépend entièrement du code qui l'appelle.

Exécuter des blocs sur un thread séparé est non seulement possible, mais c'est précisément la raison pour laquelle le concept de blocs a été introduit. Il existe pour supporter Grand Central Dispatch, qui cache une grande partie de la complexité de la programmation concurrente derrière un modèle orienté tâches.

+2

Réponse très succincte. Je pense qu'il vaut la peine d'ajouter que les blocs sont une mise en œuvre C des fermetures. http://en.wikipedia.org/wiki/Closure_(computer_science) –

+4

Qui est venu en premier? Blocs ou GCD? :) Les blocs ont été créés de manière orthogonale à GCD mais, comme le beurre de cacahuète et le chocolat, il est rapidement devenu douloureusement évident de voir à quel point ils travaillaient bien ensemble. – bbum

1

Ils ne doivent pas fonctionner sur un autre thread, mais ils le peuvent. Vous pouvez les planifier sur les files d'attente NSOperationQueues ou GCD et ces files d'attente peuvent être vidées par les threads d'arrière-plan.

Et oui, cela peut être une construction utile pour vous aider à prendre du temps sur le fil principal. Mais ce n'est pas tout ce que les blocs sont utiles, et inversement, vous pouvez faire un traitement en arrière-plan avec ou sans blocs.

1

Vous pouvez utiliser GCD pour planifier des blocs à émettre sur d'autres threads. Les deux ont été présentés ensemble, de sorte que toute discussion de l'un mentionne habituellement l'autre. Cependant, les blocs ne sont pas en soi intrinsèquement un mécanisme de multithreading.

+0

Exactement et comme démontré par les différentes API 'enumerateUsingBlocks:' .... – bbum