Мои значения UserDefaults всегда однозначны (параллелизм / параллелизм) в Swift - PullRequest
0 голосов
/ 26 марта 2019

Чтобы гарантировать, что последние значения параметров конфигурации приложения будут использоваться в моем приложении, я должен убедиться, что последние значения сначала записываются в UserDefaults.

Внутри моего 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 Ответ

1 голос
/ 26 марта 2019

Ваш вызов 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...