С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

Objective-C

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 26, средняя оценка - 4.65
Пан_Атаман
0 / 0 / 0
Регистрация: 12.02.2014
Сообщений: 34
#1

Делегаты - Objective-C

06.03.2014, 23:32. Просмотров 3778. Ответов 11
Метки нет (Все метки)

Всем доброго вечера!

Ребят, объясните доходчиво для чего нужны делегаты? и может ли их быть несколько в одной программе?


Как я это понял:
Делегат это такое свойство, которое позволяет в реализации(implementation) одного класса класса выполнить какое то действие- например вывести Action Sheet или Alert, или выполнить какой то действие перед завершением программы (например сохранить данные). Причём метод в реализации находится на особом положении- т.е. он как то абстрагирован от всей реализации (находится в отдельной коробке внутри коробки реализации класса )

Может ли быть несколько делегатов в одном классе? если да, то как их записывать?
Так: className <Delegate1> <Delegate2> ... <DelegateN>???
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.03.2014, 23:32
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Делегаты (Objective-C):

Скрытые делегаты - Objective-C
как использовать скрытые делегаты например CKSMSComposeRemoteViewControllerDelegate?

Делегаты - C#
Порылся в msdn, получил общее определение, что такое Делегат Делегат является типом ссылок на метод. Однажды назначенный делегат методу,...

Делегаты - C#
Всем добрый день.Только что начал изучать делегаты и сразу проблема-выдаёт ошибки,т.е. объект делегата не может ссылаться на методы...

Делегаты - C#
Добрый день, форумчане. Объясните на пальцах, желательно с примером, зачем нужны делегаты? Где их грамотно использовать? Заранее...

Делегаты - C#
Надо создать делегат и использовать его вместо функции Console.WriteLine() в запросе от пользователя.:)

Делегаты в Си - C (Си)
есть ли в Си делегаты, и как ими пользоваться? (книги, ссылки, развернутые ответы) гугл выдает только c++ и c# почему то... ...

11
BigDanceMouse
5 / 5 / 1
Регистрация: 26.01.2014
Сообщений: 69
06.03.2014, 23:54 #2
От части присоединяюсь к вопросу и попрошу разъяснить как создаются делегаты. (не в смысле присваивания, а например 2 класса созданных мной самим один из которых будет делегатом другого)

Топиккастеру: У вас к примеру есть поисковая строка. У нее есть метод textDidChange который вызывается когда текст в строке изменился. Вот этот метод будет вызываться у делегата этой строки. Т.е. ваша поисковая строка каждый раз при изменении текста будет вызывать метод textDidChange у своего делегата.
0
Vorona
Peace 2 all shining faces
670 / 532 / 45
Регистрация: 05.03.2010
Сообщений: 1,283
07.03.2014, 00:12 #3
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
делегаты нужны, грубо говоря, для колбеков, для оповещения о каком-то результате, пока вы заняты чем-то другим
ознакомьтесь с паттерном Observer, принцип тот же, только делегат используется в единственном числе, а Observer служит для оповещения многих объектов (массива или списка "делегатов")

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

Сказали этому объекту писать в файл, а сами тем временем показываете какое-то видео, и когда он закончит запись в файл, вы покажете какое-то сообщение или то, что вы реализовали в этом методе

Таким образом вы можете мгновенно реагировать на действия интересующего вас объекта

Добавлено через 4 минуты
Цитата Сообщение от BigDanceMouse Посмотреть сообщение
От части присоединяюсь к вопросу и попрошу разъяснить как создаются делегаты. (не в смысле присваивания, а например 2 класса созданных мной самим один из которых будет делегатом другого)
есть класс, который выполняет некое действие
есть класс, который заинтересован в этом
есть протокол, который должен имплементировать заинтересованный класс, чтобы выполняющий знал, как правильно с ним общаться

выполняющий класс знает, что если в его действиях кто-то заинтересован (неважно кто), то ему можно сказать о каком-то результате вызвав метод, который описан в протоколе

будь то таблица или аудиоплеер или еще что-то, главное чтобы он просто реализовал методы протокола и в сигнатуре класса показал что импелементирует этот протокол
1
BigDanceMouse
5 / 5 / 1
Регистрация: 26.01.2014
Сообщений: 69
07.03.2014, 00:17 #4
Цитата Сообщение от Vorona Посмотреть сообщение
выполняющий класс знает, что если в его действиях кто-то заинтересован (неважно кто), то ему можно сказать о каком-то результате вызвав метод, который описан в протоколе
Вот буду очень признателен за пример как раз этого.
Т.е. я уже не раз имплементировал объекты с их делегатами и протоколами но вот как создать самому такой объект пока что не представляю.
0
Пан_Атаман
0 / 0 / 0
Регистрация: 12.02.2014
Сообщений: 34
07.03.2014, 01:21  [ТС] #5
Цитата Сообщение от Vorona Посмотреть сообщение
будете его делегатом
тут наверное скорее наоборот -тот кто выполняет что-то в фоновом режиме есть делегат основного класса
0
mobidevelop
182 / 182 / 3
Регистрация: 10.01.2013
Сообщений: 596
07.03.2014, 03:24 #6
Vorona, позволю себе слегка поправить. Я бы не делал акцент на информировании - это всего лишь один из вариантов использования. Как показала практика, новички путаются. Да вот, хотя бы Пан_Атаман, к примеру.
На самом деле, делегат - это класс, который что-то знает или умеет. Тот, кто этого делегата использует, сам ничего подобного не умеет (или ему западло), но он точно знает кто может и как его для этого надо попросить. Житейский пример - дворник из ЖЕКа, который подметает двор по приказу начальника того же ЖЕКа. Дворник - делегат с методами встатьВПятьУтра, забацатьМетлу, сделатьЧтобЧистоТвоюМать. При этом, если эти методы выполняются в том же потоке (как, например, у UITableView с его делегатом и датасорсом), то начальник тоже не занимается своими делами, а ждет, когда дворник намашется (в реальности тоже так бывает - ходит за ним чтобы работал и ничего больше делать не может).
Другой пример:
- Что должен знать студент?
- Всё!
- А что должен знать лаборант?
- Почти то же, что и студент.
- А Аспирант?
- В какой книжке находится то, что должен знать студент.
- Доцент?
- Где находится эта книжка.
- Профессор?
- Где находится доцент.
Книжка и доцент в этом случае делегаты. Книжка для доцента, доцент - для профессора. Очевидно, они имплементят какие-то протоколы, по которым выдают то, что они них просят клиенты (доцент и профессор, соответственно).

Ну вот как-то так. Может, и не слишком академично, зато должно быть понятно.
2
Pro2005
44 / 44 / 3
Регистрация: 27.05.2013
Сообщений: 163
07.03.2014, 12:41 #7
Цитата Сообщение от Vorona Посмотреть сообщение
как создаются делегаты.
По сути считаю эту фразу некорректной. Ведь мы не создаем делегаты. Мы просто используем делегирование. И объявляем протоколы. По сути делегатом может называться абсолютной любой класс, который поддерживает требуемый протокол.
Хотя может я не прав, поправьте если что.
0
BigDanceMouse
5 / 5 / 1
Регистрация: 26.01.2014
Сообщений: 69
07.03.2014, 16:14 #8
А можно пример кода в котором как выше я спрашивал 2 класса и протокол. Один класс становиться делегатом другого.
0
noname_club
104 / 95 / 11
Регистрация: 01.05.2013
Сообщений: 600
09.03.2014, 17:56 #9
Цитата Сообщение от Vorona Посмотреть сообщение
нужны, грубо говоря, для колбеков, для оповещения о каком-то результате, пока вы заняты чем-то другим
ооо помедленнее

сам паттерн назвается Шаблон делегирования

В ObjC есть еще такое слово как "протокол", который на самом деле представляет из себя абстрактный класс. (то есть названия методов есть , а их реализации нет)

Любое делегирование идет по методам этого "протокола". Однако есть еще анонимное делегирование, то есть вызываем селектор без проверки что он там вообще есть.

Наверно самое частое использование этого паттерна конкретно в приложениях IOS принадлежит компоненту UITableView которому назначается делегирование по 2 протоколам

Objective-C
1
2
_table.delegate = self;
_table.dataSource = self;
вот эти 2 строки назначают делегирование где self это объект которому таблица будет посылать сообщения по протоколу.

UITableViewDelegate

UITableViewDataSource

и таким образом если понять как работает таблица, то можно понять как работает делегирование.

можно рассмотреть еще сам вызов селекторов

Objective-C
1
 if ([_delegate respondsToSelector:@selector(blabla)]) [_delegate performSelector:@selector(blabla) withObject:Object];
эта сама общая конструкция при вызове селектора у делегируемого объекта (_delegate)

Проверяем что это селектор там есть и потом вызываем его.
0
glvrzzz
95 / 71 / 12
Регистрация: 12.12.2012
Сообщений: 214
09.03.2014, 18:56 #10
Цитата Сообщение от noname_club Посмотреть сообщение
В ObjC есть еще такое слово как "протокол", который на самом деле представляет из себя абстрактный класс. (то есть названия методов есть , а их реализации нет)
Вы б сами для начала разобрались, что такое протокол (интерфейс), а что - абстрактный класс.
0
BigDanceMouse
5 / 5 / 1
Регистрация: 26.01.2014
Сообщений: 69
09.03.2014, 19:05 #11
Еще бы пример объявления
Цитата Сообщение от noname_club Посмотреть сообщение
_delegate
.
Есть же еще методы
Objective-C
1
conformsToProtocol:<#(Protocol *)#>
Правильно ли я понимаю что они тоже относятся к делегированию? И если да - то каким образом их применяют?
0
Vorona
Peace 2 all shining faces
670 / 532 / 45
Регистрация: 05.03.2010
Сообщений: 1,283
10.03.2014, 16:27 #12
Цитата Сообщение от Пан_Атаман Посмотреть сообщение
тут наверное скорее наоборот -тот кто выполняет что-то в фоновом режиме есть делегат основного класса
делегат это заинтересованная сторона, потому вы являетесь делегатом объекта, который что-то там делает и извещает вас об этом

Цитата Сообщение от Pro2005 Посмотреть сообщение
По сути считаю эту фразу некорректной
по сути это не моя фраза

Цитата Сообщение от Pro2005 Посмотреть сообщение
По сути делегатом может называться абсолютной любой класс, который поддерживает требуемый протокол.
По сути делегатом может называться абсолютной любой класс, протокол тут используется чисто для поддержания гибкости и полиморфизма
я, правда, не знаю или это уже будет называться шаблоном делегирования, но это также будет работать с конкретным типом, а не только протоколом

Цитата Сообщение от noname_club Посмотреть сообщение
ооо помедленнее
что-то не так сказал?
из вашего ответа не понял ничего
при чем тут UITableView, используются они везде, но вы, похоже, дальше UITableView не смотрели

Цитата Сообщение от noname_club Посмотреть сообщение
В ObjC есть еще такое слово как "протокол", который на самом деле представляет из себя абстрактный класс. (то есть названия методов есть , а их реализации нет)
бред, учите азы ООП

Цитата Сообщение от BigDanceMouse Посмотреть сообщение
Есть же еще методы
Objective-C
1
conformsToProtocol:<#(Protocol *)#>
Правильно ли я понимаю что они тоже относятся к делегированию? И если да - то каким образом их применяют?
не совсем, этот метод спрашивает у класса или он имплементирует протокол, но этого не всегда достаточно, так как нам еще нужно знать или объект "отзывается" на методы протокола (а его клас их реализует)
так как objective-c полудинамический язык, нам нужно делать такие проверки (respondsToSelector)

и протоколы используются в более широких кругах, нежели только для делегирования
протоколы являются аналогами интерфейсов в других яп поддерживающих ооп (а не абстрактных классов, как это ошибочно сказал noname_club)

кстати, вот увидел неплохую статью: http://www.raywenderlich.com/46988/ios-design-patterns
и ее перевод: http://habrahabr.ru/post/202960/
0
10.03.2014, 16:27
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.03.2014, 16:27
Привет! Вот еще темы с ответами:

Делегаты - Visual Basic .NET
Давно пытаюсь понять смысл делегатов в VB.net и даже удалось понять некоторые вещи, но на данный момент остаётся еще довольно много...

Делегаты - C#
Практикуюсь с примерами из учебника Шилдта. using System; class A { static void Main() { ssil obj = new...

Делегаты С++ - C++/CLI
static float elliptic_paraboloid(float x1, float x2) { return pow(((x1-0)*cos(80*3.14/180)+(x2-1)*sin(80*3.14/180)), 2)/4+ ...

Делегаты - C#
Почему так компилируется Func&lt;decimal, decimal&gt; f = null; f=x =&gt; x &gt; 1 ? f(x - 1) + f(x - 2) : x; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.