Objective-C/Cocoa: Надлежащий дизайн для делегатов и контроллеров

Каждый оператор RUN, который вы добавляете в Dockerfile, создает новый слой, и в конце все слои объединяются (не объединяются напрямую, есть некоторые правила) для построения окончательного изображения. Даже если вы измените / удалите какой-то файл на верхнем слое, он не удалит его с нижних слоев, а лишь каким-то образом затеняет его.

Вот пример Dockerfile:

FROM baseimage
RUN wget -O file http://...
RUN rm file

Для простоты, изображение, которое baseimage составляет 100 МБ, file составляет 80 МБ, и для этой сборки создано три слоя. Первый уровень - 100 МБ, второй - 80 МБ, последний имеет только некоторые метаданные, чтобы указать, что файл со второго уровня удален. Таким образом, результирующее изображение будет 180 МБ (состоит из трех слоев), даже если вы удалите 80 МБ на последнем слое.

Но если вы получите, установите и удалите один и тот же слой, вы увидите разницу:

FROM baseimage
RUN wget -O file http://... && rm file

Теперь ваш первый слой равен 100 МБ, а второй - ~ 0 МБ (поскольку вы удаляете файл в том же выражении RUN), и ваш образ равен 100 МБ.

В двух словах, вы должны установить и удалить в одном выражении RUN.

7
задан Jake 4 May 2009 в 16:30
поделиться

4 ответа

На неназванном форуме разработчиков кто-то пишет:

Короче говоря, я решил, что начну использовать NSNotifications. Стэнфордский онлайн-курс, которым следуют люди, преподают два инженера Apple. Только что они недвусмысленно заявили, что НЕ должны использовать делегат приложения или глобальные переменные, и сказали, что они должны использовать NSNotification, делегаты и наблюдения KV.

Если это то, что говорят инженеры Apple, я собираюсь двигаться в этом направлении.

NSNotifications довольно изобретательны в том смысле, что они не слишком сильно мешают инкапсуляции. Слушатель слушает только уведомление и объект - я не думаю, что он должен знать или заботиться о том, кто его отправил.

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

4
ответ дан 7 December 2019 в 12:25
поделиться

На ум приходят 2 варианта:

  • Если событие, которое будет делегировано, отправлено вашим контроллером, вы можете заставить этот метод возвращать значение контроллеру для отправки в представление .

  • Вы также можете привязать значение infoLabel к какому-либо ключу (используя, скажем, привязки какао или просто необработанное наблюдение за значением ключа). Связанный объект (который может быть делегатом или каким-либо другим объектом модели) может просто обновить связанный ключ, который отправит значение в infoLabel. В качестве примера вы можете привязать член «info» делегата к значению infoLabel. Когда делегат получает событие, он может обновить элемент информации, и представление изменится. Сама фактическая привязка может происходить в IB (если ваш делегат находится в пере) или в контроллере (который имеет ссылку на представление и делегат.

2
ответ дан 7 December 2019 в 12:25
поделиться

Мы реализовали хитрый объект «Данные», который довольно хорошо контролирует много всего. Он проверяет наличие изменений и обновляет все глобальные переменные.

При создании новых экземпляров я обращаюсь к классу Data следующим образом:

[[Button alloc] initWithData:data]];

Где data является одиночным классом Data. Теперь мы можем проверить, есть ли какие-то изменения, на которые необходимо отреагировать.

Я признаю, что для этого по-прежнему требуется ссылка, как вы описали. Нет

0
ответ дан 7 December 2019 в 12:25
поделиться

Обычно, как вы сказали, передать указатель на MainView через его методы делегата. Итак, если MainView вызывает метод doSomethingWithFoo: своего делегата, вы хотите изменить этот метод на:

- (void)mainView:(MainView *)view doSomethingWithFoo:(id)foo

и соответственно вызвать новый метод. Если вы работаете непосредственно с указателем MainView, у вас не должно возникнуть проблем с циклическими ссылками.

-1
ответ дан 7 December 2019 в 12:25
поделиться