Подтвердить что ты не робот

Что лучше описывает objective-C и Cocoa Bindings?

У меня проблемы с пониманием Cocoa Привязки. Может ли кто-нибудь объяснить мне, что это такое, таким образом, который воспринимается по-человечески?

4b9b3361

Ответ 1

Связывание - это система для подключения ваших представлений к вашим контроллерам без написания большого количества кода клея, чтобы они явно говорили друг с другом. Все, что вам нужно сделать, это настроить свойства в обоих классах * и подключить привязку в IB.

Традиционный подход состоит в том, что в представлении есть один или несколько выходов, чтобы поговорить с контроллером (наиболее общие примеры - delegate и target), а контроллер имеет выходы для разговора с представлениями. Когда контроллер обновляет модель, он отправляет (например) [view modelChange:newModelObject]. Когда представление хочет обновить модель, оно отправляет некоторое сообщение делегата своему делегату (контроллеру), например NSText textDidChange:.

С помощью Bindings все, что вам нужно сделать в коде, - это реализовать свойства представления и свойств на контроллере, а затем выставить одно или несколько свойств представления как привязки *. Тогда вам нужно только привязать привязку. Если это класс Cocoa, это торт: просто установите его в IB. Если это собственный пользовательский класс, вы, вероятно, напишите сообщение bind:toObject:withKeyPath:options: самостоятельно (не намного сложнее).

Позвольте мне повторить следующее: с помощью Bindings весь ваш код клея (большую часть времени) находится в контроллере [view bind:@"viewProperty" toObject:self withKeyPath:@"controllerProperty.modelProperty" options:options];. Все остальное обрабатывается системами Bindings и KVO за кулисами и вашими аксессуарами свойств.

Недостатком является то, что вы должны строго соответствовать требованиям Cocoa Bindings. Они просты, но многие старые приложения разработаны таким образом, что не подходят для Cocoa Bindings.

  • Вы должны создать реальные объекты модели, а не просто передавать примитивные объекты (например, массивы словарей). Если вы используете Core Data, это легко: ваши управляемые объекты являются объектами модели.
  • Вы должны либо правильно записать своих аксессуаров, либо синтезировать правильные аксессоры. Например, свойство NSString всегда должно быть @property(copy), never @property(retain) (потому что в противном случае вы обнаружите, что сохраняете другую изменяемую строку, которую они потом будут мутировать, пока вы ее удерживаете).
  • Вы должны изменять свойства объектов модели по их свойствам (model.foo = bar) или сообщениям-аксессуарам ([model setFoo:bar]), никогда не используя прямой доступ к переменной экземпляра. (Очевидное исключение для самих методов доступа, если вы сами написали, потому что они должны напрямую обращаться к переменной экземпляра.)

Есть два преимущества:

  • Вы можете написать совершенно новый класс представления, не выбирая много кода клея. Больше всего вам нужно удалить несколько сообщений bind:::: для старых свойств вида. Если через пару лет вы пройдете путь, вы решите, что ваш текущий вид просто не может масштабировать ваше приложение вперед, это дает вам гибкость, чтобы вырвать его и начать заново с минимальной болью.
  • Что еще более важно, чем меньше кода вы читаете, тем легче читать его.

* И, согласно документации, реализуйте ошибку документации.

Добавлено 2009-03-07: А, нашел цитату. "Подклассы NSView могут выставлять дополнительные свойства, совместимые с ключом-значением/ключ-значение-наблюдая, как привязки, вызывая метод класса exposeBinding: для каждого из свойств". - NSKeyValueBindingCreation Таким образом, вам не нужно использовать метод наблюдения KVO.

Ответ 2

Предыдущий ответ очень сложный и хороший, я просто подумал, что добавлю ответ, объясняет, что это за его сердцевину, не включая Cocoa или Objective-C. Это связано с тем, что сама концепция является агностикой языка, хотя динамические языки, такие как Objective-C, делают ее намного проще, чем более статический язык, такой как С++.

Пример

Скажем, у вас есть два объекта M и V. M имеет методы:

setX(int x);
setY(int y);
int getX();
int getY();

В то время как V имеет методы:

setA(int x);
setB(int y);
int getA();
int getB();

Один из способов взглянуть на это состоит в том, что M имеет свойства x и y и V имеет свойства a и b. Вы хотите изменить свойство x, чтобы вызвать изменение свойства b и изменение y, чтобы вызвать изменение a.

При изменении свойства x мы имеем в виду, например:

M.setX(10)

где ранее

M.getX() != 10

Итак, нам нужен вызов setX на M, чтобы вызвать вызов setA на V.

Какие привязки позволяют вам сказать, что свойство b на объекте V привязано к свойству x на объекте M. А затем это обновление обрабатывается автоматически. Вам как кодер не нужно писать код, который проверяет, изменился ли x, а затем вызовите setB на V. Привязки автоматически об этом заботятся.

Резюме

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