#swift #concurrency
#swift #параллелизм
Вопрос:
Чтобы гарантировать, что последние значения параметров конфигурации приложения используются во всем моем приложении, мне нужно убедиться, что последние значения сначала записываются в пользовательские настройки по умолчанию.
Внутри моего didFinishLaunchingWithOptions
я вызываю следующую функцию
DataService.run.fetchLatestAppConfigSettings()
Моя fetchLatestAppConfigSettings()
функция:
func fetchLatestAppConfigSettings(){
REF_APPCONFIGSETTINGS.observeSingleEvent(of: .value, with: { (snapshot) in
let venueRadius = snapshot.childSnapshot(forPath: "venueRadius").value as! Double
self.defaults.set(venueRadius, forKey: VENUE_RADIUS)
let discoverRadius = snapshot.childSnapshot(forPath: "discoverRadius").value as! Double
self.defaults.set(discoverRadius, forKey: DISCOVER_RADIUS)
}) { (error) in
print("error (error.localizedDescription)")
}
}//end func
Следующий VC использует значения из UserDefaults, но поскольку к моменту выполнения следующего кода последнее значение не было записано, значение всегда отстает на единицу.
func fetchVenues(forLocation: CLLocation, handler: @escaping (_ venuesLoaded: Bool) -> ()){
//radius value passed is not the latest
DataService.run.getAllVenues(deviceLocation: forLocation, radius: DataService.run.venueRadius) { (venues) in
self.venueArray = venues
self.filteredVenueArray = venues
self.tableView.reloadData()
handler(true)
if self.filteredVenueArray.count == 0{
self.emptyStateLabel.isHidden = false
} else {
self.emptyStateLabel.isHidden = true
}
}//end func
Ответ №1:
Ваш вызов firebase является асинхронным, поэтому вам нужно сообщить всем, кто заинтересован, что ваши значения по умолчанию изменились после завершения вызова firebase. Самый простой способ сделать это — просто опубликовать пользовательское уведомление. Каждый, кто заинтересован в изменении, должен прослушать уведомление.
//Make your custom notification
extension Notification.Name {
static let userDefaultsUpdated = Notification.Name("userDefaultsUpdated")
}
//Post the notification when you update defaults
NotificationCenter.default.post(Notification(name: .userDefaultsUpdated))
//Subscribe everywhere that needs to be interested in UserDefaults changes
let token = NotificationCenter.default.addObserver(forName: .userDefaultsUpdated, object: nil, queue: .main) { notification in
//Do stuff with new defaults here
}