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

Кодовые блоки полностью заменяют делегатов?

Теперь, когда блоки, наконец, поддерживаются для разработки iphone/ipad, полностью ли они устраняют необходимость делегирования или делегированы еще более чистыми как полная реализация интерфейса, в то время как блоки более подходят для одиночных задач?

4b9b3361

Ответ 1

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

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

EDIT: так, некоторые примеры:

UIScrollViewDelegate является корректным протоколом делегатов, потому что (i) существует широкий диапазон вещей, которые могут потребоваться для передачи; (ii) их, возможно, необходимо будет сообщать в любом порядке и в любое время; и (iii) они будут сообщены по причинам, не зависящим от делегата.

NSURLConnection +sendAsynchronousRequest:queue:completionHandler: правильно берет блок для доставки результатов, потому что (i) есть только один результат для отчета; и (ii) отчет возвращается как прямое следствие действий, предпринятых вызывающим.

Ответ 2

Интересная мысль - в то время как вы могли использовать блок/закрытие вместо метода обратного вызова, я не вижу, как это можно было бы использовать для замены системы делегатов - ведь делегирование - это почти средство объекта для объекта и, следовательно, возможности намного богаче, чем просто выполнение произвольной части кода.

Таким образом, я должен согласиться с комментарием "более подходящим для одиночных задач" (и даже тогда только определенными изолированными задачами).

Ответ 3

Я пытался решить, оставить ли я комментарий по другим ответам или оставить свой ответ. Я решил, и вот он.

Я разработчик С#, прежде всего, поэтому я могу легко увидеть, как я могу заменить весь шаблон делегирования блоками, потому что С# всегда рассматривал глаголы как граждан первого класса. Фактически, это было одним из самых трудных вещей, с которым можно привыкнуть, когда я начал работать с Java и платформой Android. Этот опыт упростился, когда я узнал Objective-C и Cocoa.

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

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

Например, рассмотрение результата UIAlertView, которое я чувствую, должно основываться на блоках вместо делегатов. Это всегда было для меня немного странным, но блок был недоступен, когда была разработана определенная часть API. В результате я никогда не был уверен, что Apple считает, что это должен быть предпочтительный подход или если это был единственный подход в то время.

Недавно я включил GameKit в одну из моих игр и обнаружил, что большинство асинхронных вызовов (фактически, все те, которые я использовал) не используют делегатов; они используют блоки. Я бы предположил, что если они смогут переписать UIAlertView сегодня, они, скорее всего, будут использовать блоки вместо делегатов для обработки обратных вызовов после ввода пользователем. Конечно, это просто предположение.

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

Ответ 4

Я занимаюсь своими исследованиями по этому предмету, и я нашел эту статью очень поучительной, написанной Джастином Дрисколлом, и я надеюсь, что она тоже поможет кому-то другому.

Вот ссылка: Связь с блоками в Objective-C

Ответ 5

Делегаты. Вы можете использовать делегат, если хотите знать процесс/события/состояние. Например, в NSURLConnectionDelegate вы получите статус данных с двумя или несколькими методами делегирования .didReceive: NSData connectionDidFinishLoading

Блоки. Вы можете использовать блок только тогда, когда ожидаете результат или ошибку.

Лучшие ссылки - http://blog.stablekernel.com/blocks-or-delegates/