Вы должны использовать всю систему NotificationCenter
.
Проще говоря, вы можете сделать так, чтобы объекты подписывались на значение по умолчанию NotificationCenter
и указывали селектор (метод), который будет выполняться при публикации уведомления.
Вы также можете публиковать пользовательские уведомления, которые представляют событие смены обоев.
Я использовал это в приложении, которое построил, чтобы добиться общесистемного перехода в «темный режим».
Для публикации:
@objc func postWallpaperChangeNotification() {
NotificationCenter.default.post(name: .wallpaperChanged, object: nil)
}
Для подписки:
NotificationCenter.default.addObserver(self, selector: #selector(someMethodToRunWhenWallpaperChanges(_:)), name: . wallpaperChanged, object: nil)
Также необходимо удалить наблюдателя в deinit()
. [+1112]
Это приблизительный код, чтобы дать вам вкус, любые вопросы хму.
При возврате ActionResult вместо "просто выполнения вообще ActionResult делает" (т.е. использует Ответ. Перенаправьте непосредственно, или пытающийся представить Представление посредством Ответа OutputStream непосредственно) дает Вам одно действительно хорошее преимущество: Поблочное тестирование действительно легко на этом, тем более, что Вам обычно не нужен веб-сервер к модульному тесту Проекты MVC.
Приложение: Как пример для перенаправления:
Если Вы делаете
return Redirect(newUrl);
в Вашем контроллере Ваш Модульный тест может теперь
Приложение 2: И в то время как я нахожусь на нем, вот пример Пользовательского ActionResult:
http://www.stum.de/2008/10/22/permanentredirectresult/
Это должно только показать, что они не "Черная магия". Они на самом деле довольно просты: Ваш Контроллер возвращает Результат Действия, и Время выполнения MVC в конечном счете вызовет функцию ExecuteResult на нем, передающий в ControllerContext, с которым может взаимодействовать Ваш ActionResult. Самое главное снова должно разделить части M-V-C, чтобы сделать Код Допускающим повторное использование, и сделать Поблочное тестирование легче, или короче говоря: дать очень чистую Платформу.
Так как это - базовый класс, это позволяет Вам возвращать любой из подклассов ActionResult, таких как ViewResult или JsonResult. Я обычно возвращаю ViewResult как значение по умолчанию, но переопределяю то поведение, если я имею дело с Ajax для возврата объекта JsonResult.
Это позволяет мне добавлять Ajax как прогрессивное улучшение и сохранять приложение, работающее без JavaScript и без потребности в действиях отдельного контроллера.
ActionResult является базовым классом для многих различных типов результатов контроллера. Путем возврата базового класса действие контроллера может возвратить различные типы результатов в зависимости от результата метода - ViewResult, RedirectToActionResult, и т.д. ActionResult содержит все данные, необходимые Представлению или новому Действию, которое является результатом текущего действия контроллера.