Мои значения по умолчанию пользователя всегда на единицу отстают (параллелизм) в Swift

#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
}