Основная причина, по которой существуют делегаты, на самом деле в ситуациях, подобных той, которую вы описываете.
У вас есть некоторые функциональные возможности в классе, но функциональность асинхронная, то есть вы не можете просто получить информацию сразу, или она реализована асинхронно (например, загрузка большого файла из сети должна / делает происходит асинхронно, чтобы не блокировать весь интерфейс в течение минуты +).
Таким образом, используя делегирование, вы можете сказать: «Просто станьте моим делегатом, и я, в конце концов, вернусь к вам, мы уже закончили». Затем объект может вернуться обратно к вызывающей стороне в удобное для него время, а не наоборот (вызывается только тогда, когда этого хочет основное приложение).
Как уже говорилось, загрузка файлов и вот где делегирование вступает в игру. Это также очень полезный инструмент для вашего собственного кодирования для включения делегатов в ваш код, в случаях, когда вам нужно либо ждать делегирования от какого-либо другого объекта (например, CLLocationManager), либо вам нужно что-то обрабатывать на отдельный поток (например, анализ данных или еще много чего).