UserDefaults removeObjectForKey не работает?

Я установил некоторое значение по умолчанию для пользователя в моем приложении в начале. Затем эти значения могут быть переопределены пользователем, и я хочу удалить эти настройки.

Когда я пытаюсь удалить все по умолчанию, несколько ключей-значений удаляются, но несколько ключей не удаляются сразу. Когда я убиваю приложение и снова возвращаюсь к приложению, оно работает как удаленное. Как я и ожидал, он должен работать сразу после удаления ключа.

Вот мой код в swift 3.2 для установки значения по умолчанию

let sharedUserDefaultsWithExtension = UserDefaults(suiteName: "GROUP_IDENTIFIER")
sharedUserDefaultsWithExtension?.setValue(newValue, forKey: "My_Key")
sharedUserDefaultsWithExtension?.synchronize()

Код для удаления всех пользовательских значений по умолчанию

let sharedUserDefaultsWithExtension = UserDefaults(suiteName: "GROUP_IDENTIFIER")
for key in (sharedUserDefaultsWithExtension?.dictionaryRepresentation().keys)! {
    sharedUserDefaultsWithExtension?.removeObject(forKey: key)
}
sharedUserDefaultsWithExtension?.synchronize()

Есть идеи?


person Nimisha Ranipa    schedule 19.05.2018    source источник


Ответы (1)


Если вы хотите удалить все данные из userdefault, используйте:

let bundleIdentifier = Bundle.main.bundleIdentifier!
UserDefaults.standard.removePersistentDomain(forName: bundleIdentifier)

А для set данные по умолчанию пользователя:

UserDefaults.standard.setValue("jogendar", forKey: "My_Key")

И по-вашему, вам нужно синхронизировать данные сразу после удаления, но не пытайтесь synchronize() как упомянуто в документе https://developer.apple.com/documentation/foundation/userdefaults/1414005-synchronize

synchronize(): - Ожидает любых ожидающих асинхронных обновлений базы данных по умолчанию и возвращается; этот метод не нужен и не должен использоваться.

let sharedUserDefaultsWithExtension = UserDefaults(suiteName: "GROUP_IDENTIFIER")
for key in (sharedUserDefaultsWithExtension?.dictionaryRepresentation().keys)! {
    sharedUserDefaultsWithExtension?.removeObject(forKey: key)
    sharedUserDefaultsWithExtension?.synchronize()
}
person Jogendar Choudhary    schedule 19.05.2018
comment
.synchronize() теперь устарело, как объяснено в документации. Его следует удалить из любого кода, использующего UserDefaults. - person Eric Aya; 19.05.2018
comment
@Moritz: Спасибо, да, это нужно удалить - person Jogendar Choudhary; 19.05.2018