0

Bon, c'est une question de conception. Moi, comme beaucoup, j'apprends encore l'Objective-C et le Cocoa, et je suis un peu rouillé. Quoi qu'il en soit, voici la question:Question de conception Objective-C. Bonne utilisation des observateurs? Événements? Conseil sur la stratégie du code LF

Supposons que j'ai une classe ViewController 'A'.
Supposons que j'ai une classe "Camera" "B", qui est un singleton.
Supposons que j'ai une classe UILabel 'C'.

Le ViewController « A » a connaissance de la « caméra » « B » et peut toujours facilement obtenir une référence à lui en demandant B.sharedInstance

Je mis en place une minuterie dans « A » qui à plusieurs reprises des appels une méthode dans la classe "Camera" "B".

Chaque fois que la méthode « B » est appelé par la minuterie, je veux aussi envoyer un message à la UILabel « C » et ....

Seulement, la « caméra » « B » n'a aucune connaissance du UILabel, donc je ne peux pas mettre à jour UILabel dans la méthode de la caméra qui est appelée par le timer.

La valeur affichée par UILabel provient de la "Caméra". Il doit obtenir cette information immédiatement après que la minuterie a appelé la méthode appelée par minuterie dans la classe "Camera".

Comment le concevoir correctement afin que le UILabel 'C' puisse être correctement informé des changements dans la "caméra" à chaque fois que la minuterie appelle sa méthode.

Si vous êtes toujours avec moi, merci de lire. Tout conseil serait certainement instructif. Merci d'avance pour toute aide que vous pouvez offrir.

Je me rends compte que je pourrais passer le UILabel comme argument à la caméra dans l'appel de la minuterie, mais cela semble vraiment moche. Et je pourrais faire de UILabel un singleton, et ensuite la caméra pourra appeler C.sharedInstance, ce qui est toujours logique dans ce programme mais cela semble WAY faux.

Quelle est la bonne façon de procéder?

Répondre

0

Je pense que cela dépend où UILabel est situé. C'est le contrôleur de vue devrait gérer toutes les mises à jour de l'étiquette. Donc, si 'A' est le contrôleur de vue de l'UILabel (l'étiquette fait partie de la vue 'A'), alors 'A' devrait prendre soin de l'étiquette.

Vous pouvez utiliser différentes méthodes pour obtenir les données de la caméra. L'un des plus simples serait de créer un CameraDelegateProtocol et de faire de 'A' le délégué de 'B'. Alors 'B' peut envoyer un message de délégué à 'A' avec peut-être quelques paramètres, et 'A' peut alors mettre à jour le UILabel.

Si vous souhaitez mettre à jour plusieurs étiquettes dans l'application, vous pouvez utiliser un système de notification. Lorsque j'utilise un singleton comme 'B', je pense qu'un système de notification serait beaucoup plus agréable, parce que puisque plusieurs objets peuvent référencer et utiliser 'B', plusieurs objets devraient pouvoir recevoir des mises à jour. Faire 'C' un singleton semble être une très mauvaise idée, car il fait un couplage très serré entre 'B' et 'C'. L'utilisation de délégués/notifications ou quelque chose de similaire crée un couplage de pou, ce qui est excellent pour la réutilisation des classes.

0

Semble à moi comme votre minuterie devrait invoquer une méthode dans votre contrôleur de vue, qui envoie ensuite le bon message à la caméra et met à jour l'étiquette.L'appareil photo doit afficher les informations devant être affichées sur l'étiquette en tant que propriété.