Есть много способов нарезать это.
Я бы не советовал собирать эти данные с ваших датчиков в контроллере вида.Это не совсем работа контроллера представления.Хуже, когда есть несколько объектов, которым нужны данные датчика.
Вероятно, самым чистым дизайном было бы создание отдельного объекта (я назову его SensorManager), который собирает данные вашего датчика и передает их всем, кому небезразлично.
Возможно, у вас есть SensorManager
используйте NotificationCenter
для трансляции уведомлений, а затем попросите все заинтересованные объекты добавить наблюдателей для уведомлений, которые им нужны.Это дает вам очень слабую связь между SensorManager
и объектами, которые получают уведомления о данных датчика.Недостатком является то, что код сложнее отлаживать.
С другой стороны, вы можете настроить SensorManager
на массив объектов, о которых он уведомляет.Я бы определил протокол, который имеет один или несколько методов, которые вызываются с данными датчика, и чтобы SensorManager поддерживал массив клиентских объектов, которые соответствуют этому протоколу.Когда SensorManager имеет новые данные датчика, он будет проходить через массив клиентских объектов и вызывать соответствующий метод для каждого, чтобы сообщить каждому о новых данных.Этот второй вариант в некотором роде похож на шаблон проектирования делегатов, но это один-ко-многим, где шаблон делегата представляет собой передачу информации один на один.
Если вы преданы идеесобирая данные датчика в вашем главном контроллере представления, и вы создаете свои дочерние контроллеры представления, используя встраиваемые сегменты, тогда вы можете написать prepareForSegue()
метод в вашем главном контроллере представления, который ищет целевые контроллеры представления, которые соответствуют протоколу.Давайте назовем это SensorDataListener
.Контроллер основного представления может сохранять эти объекты в массиве и уведомлять объекты о новых данных датчика, используя методы в протоколе.(Этот последний подход аналогичен подходу создания SensorManager
объекта, но вместо этого он будет основным контроллером представления, выполняющим эту роль.)
//At the top of your class:
protocol SensorDataListener {
func newSensorData(_ SensorData)
}
var sensorClients = [SensorDataListener]()
//...
func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let dest = segue.desination as SensorDataListener {
sensorClients.append(dest)
}
}
А затем, когда вы получите новые данные
sensorClients.forEach { sensorClient in
sensorClient.newSensorData(sensorData)
}