Что хранит и за что отвечает DataSource в UIKit?

Ответ

DataSource (объект, реализующий протокол, например, UITableViewDataSource) — это поставщик данных и информации о структуре для UI-компонента. Он не хранит состояние вида, только данные.

Основные обязанности DataSource:

  1. Количество: Определяет количество секций и строк/ячеек.
  2. Контент: Предоставляет данные для конфигурации конкретной ячейки (cellForRowAt).
  3. Управление данными: Обрабатывает редактирование (удаление, перемещение строк).

Пример для UITableView:

class TaskListDataSource: NSObject, UITableViewDataSource {
    // DataSource ХРАНИТ данные
    private var tasks: [Task] = [Task(name: "Купить продукты"), Task(name: "Закончить проект")]

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return tasks.count // Отвечает за количество
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
        // Конфигурирует ячейку ДАННЫМИ
        cell.textLabel?.text = tasks[indexPath.row].name
        return cell
    }

    // Может отвечать за удаление
    func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
        if editingStyle == .delete {
            tasks.remove(at: indexPath.row) // Удаляет из своих данных
            tableView.deleteRows(at: [indexPath], with: .fade)
        }
    }
}

Важно: DataSource отделен от Delegate, который отвечает за поведение и обработку действий пользователя (нажатия, выбор).

Ответ 18+ 🔞

А, ну это ж классика, блядь! DataSource, ёпта, как этот Герасим из рассказа — он немой, но он всё делает, блядь! Он поставщик, понимаешь? Не хранит он там, сука, как вид выглядит, нихуя. Только данные, блядь, только факты!

Чем этот мужик занимается, этот DataSource:

  1. Считает, блядь. Сколько там секций, сколько строк — он говорит. «Му-му», то есть «две строки», блядь.
  2. Кормит, сука. Даёт контент для каждой ячейки. Вот тебе текст, вот тебе картинка — на, жри.
  3. Управляет бардаком. Если надо удалить строку или переместить — он этим и занимается, в рот меня чих-пых!

Смотри, как это выглядит в коде, на примере списка дел:

class TaskListDataSource: NSObject, UITableViewDataSource {
    // DataSource ХРАНИТ данные, как Герасим собачку свою
    private var tasks: [Task] = [Task(name: "Купить продукты"), Task(name: "Закончить проект")]

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return tasks.count // Вот, блядь, говорит: «Две строки у тебя!»
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
        // А тут он, сука, ячейку начиняет данными, как пирожок
        cell.textLabel?.text = tasks[indexPath.row].name
        return cell
    }

    // А если пользователь решил удалить — он и это обработает, ёбаный максималист!
    func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
        if editingStyle == .delete {
            tasks.remove(at: indexPath.row) // Выкинул из своего массива, и всё
            tableView.deleteRows(at: [indexPath], with: .fade)
        }
    }
}

И главное, ёпта, не путай его с Delegate! Это другой персонаж, блядь. DataSource — это немой работяга, который данные таскает. А Delegate — это уже барин, который решает, что делать, когда по ячейке тапнули или свайпнули. Один кормит, другой — командует, вот и вся разница, ебать мои старые костыли!