Делегат или нотификация — когда что выбрать?
Суть
Это три разных способа сообщить «что-то произошло», и выбор зависит от числа получателей и силы связи:
- Delegate — один получатель, явный контракт-протокол, ссылка
weak(протоколAnyObject), отправитель знает, что получатель есть, и может получить ответ (shouldSelectRowвозвращаетBool). Пример:UITableViewDelegate,URLSessionDelegate. - Closure / callback — один получатель, разовое или простое событие (
onConfirm, completion). Короче делегата, но при хранении нужен[weak self]. - NotificationCenter — много получателей, отправитель о них не знает, связь слабая, ответа нет. Пример:
keyboardWillShow, смена темы, logout, системные уведомления.
Про «синхронность»: делегат и closure вызываются напрямую, уведомления через post тоже доставляются синхронно в потоке отправителя — это не критерий выбора. Критерий — связность и количество подписчиков.
Продолжение ответа с кодом и уточняющими вопросами интервьюера — в приложении DevPrep.
Полный ответ — в DevPrep