Источник данных подобен делегату, за исключением того, что его методы предоставляют данные для отображения другого объекта.
К числу основных классов Cocoa с источниками данных относятся UITableView, UlCollectionView, UlPickerView и UlPageViewController. В каждом отдельном случае источник данных должен формально соответствовать протоколу с обязательными методами.
Некоторым начинающим программировать в системе iOS непонятно, зачем вообще нужен источник данных. Почему для этого недостаточно табличных данных или хотя бы некоторой фиксированной структуры данных? Дело в том, что такая архитектура способна нарушить универсальность. В то же время применение отдельного источника данных позволяет отделить объект, отображающий данные, от объекта, управляющего данными, а также высвободить последний для хранения и получения этих данных каким угодно способом (см. описание шаблона “модель-представление-контролллер” в главе 13). Единственное требование к источнику данных состоит в том, что он должен быстро предоставлять информацию, поскольку она будет запрашиваться у него в реальном времени, когда ее потребуется отобразить.
Не совсем понятно и то, чем источник данных отличается от делегата. Однако это сделано только ради сохранения универсальности, хотя и не является обязательным требованием. На самом деле нет никаких причин для того, чтобы источник данных и делегат не должны быть одним и тем же объектом, и чаще всего они могут быть таковыми. Как правило, методы
источника данных и делегата настолько тесно взаимодействуют, что трудно даже уловить их различие.
В приведенном ниже примере реализуется представление типа UlPickerView, дающее пользователю возможность выбрать день недели по названию (на английском языке в григорианском календаре). Два первых метода являются методами источника данных из класса UlPickerView, а третий — метод делегата их того же класса UlPickerView. Все три метода служат для того, чтобы предоставить содержимое представления, в котором выбираются дни недели.