Objective-C Дизайн Вопрос. Правильное использование наблюдателей? События? LF код стратегии - PullRequest
0 голосов
/ 22 июля 2010

Хорошо, это вопрос дизайна.Я, как и многие, все еще изучаю Objective-C и Cocoa, и немного заржавел.В любом случае, вот вопрос:

Предположим, у меня есть класс ViewController 'A'.
Предположим, у меня есть класс "Camera" 'B', который является одиночным.
Предположим, у меня есть классКласс UILabel 'C'.

ViewController 'A' знает о «камере» «B» и всегда может легко получить ссылку на нее, запросив B.sharedInstance

, которую я установилтаймер в 'A', который неоднократно вызывает метод в классе 'Camera' класса 'B'.

Каждый раз, когда метод в 'B' вызывается таймером, я также хочу отправить сообщение на UILabel 'C' также ....

Only, "Camera"«B» не знает UILabel, поэтому я не могу обновить UILabel в методе камеры, который вызывается таймером.

Значение, отображаемое UILabel, взято из «Камеры».Он должен получить эту информацию сразу после того, как таймер вызвал метод, вызванный таймером, в классе «Камера».

Как правильно спроектировать это, чтобы UILabel 'C' могла быть должным образом проинформирована об изменениях в«Камера» каждый раз, когда таймер вызывает его метод.

Если вы все еще со мной, спасибо за чтение.Любой совет, безусловно, будет поучительным.Заранее благодарен за любую помощь, которую вы можете предложить.

Я понимаю, что мог бы передать UILabel в качестве аргумента камере при вызове таймера, но это кажется действительно уродливым.И я мог бы сделать UILabel синглтоном, и тогда камера сможет вызвать C.sharedInstance, который все еще имеет смысл в этой программе, но кажется, что это НЕПРАВИЛЬНО.

Каков правильный способ сделать это?

Ответы [ 2 ]

0 голосов
/ 22 июля 2010

Похоже, ваш таймер должен вызвать метод в вашем контроллере представления, который затем отправляет правильное сообщение на камеру и обновляет метку.Камера должна отображать информацию, которая должна отображаться в метке как свойство.

0 голосов
/ 22 июля 2010

Я думаю, это зависит от того, где находится UILabel. Это контроллер представления должен обрабатывать любые обновления метки. Поэтому, если «A» является контроллером представления UILabel (метка является частью представления «A»), тогда «A» должно заботиться о метке.

Вы можете использовать несколько различных способов получения данных с камеры. Одним из самых простых будет создать CameraDelegateProtocol и сделать «A» делегатом «B». Затем «B» может отправить сообщение делегата «A» с возможно некоторыми параметрами, а «A» может обновить UILabel.

Если вы хотите обновить несколько ярлыков в приложении, вы можете использовать систему уведомлений.

При использовании синглтона, такого как «B», я думаю, что система уведомлений будет намного приятнее, поскольку, поскольку несколько объектов могут ссылаться и использовать «B», несколько объектов должны иметь возможность получать обновления.

Делать 'C' синглтоном кажется очень плохой идеей, так как он создает очень тесную связь между 'B' и 'C'. Использование делегатов / уведомлений или чего-то подобного создает вшивую связь, которая отлично подходит для повторного использования классов.

...