Pourquoi NSUserDefaults est-il utilisé dans iOS?

Je suis nouveau dans le développement iOS et le développement D'applications mobiles en général, j'ai des connaissances décentes sur les modèles Objective C et MVC à utiliser et je n'ai jamais fait de développement Mac.

J'ai du mal à comprendre à quoi sert NSUserDefaults?

Nous avons déjà quelque chose comme PList qui stocke les données en XML et nous avons SQLite qui est une base de données légère pour de tels périphériques.

Alors pourquoi l'avons-nous?

Est - ce une alternative simple clé-valeur de stockage pour notre application dans le même façon dont nous avons différents types de stockage sur le cloud comme un SGBDR et un magasin NoSQL basé sur la clé-valeur, etc. ?

Pour NSUserDefaults, les documents Apple disent que: -

"les Applications enregistrent ces préférences en attribuant des valeurs à un ensemble de paramètres dans la base de données par défaut d'un utilisateur"

Que signifient-ils par la base de données par défaut de l'utilisateur?

Je suppose que, comme dans tout système d'exploitation multi-utilisateurs, nous avons différents comptes d'utilisateurs et de la même manière dans Mac que nous pourrions avoir plusieurs utilisateurs ayant chacun une base de données à partir de laquelle les applications chargeraient les préférences enregistrées pour cet utilisateur.

Donc, comme Mac OS X, iOS a-t-il également plusieurs utilisateurs et selon celui qui est connecté NSUserDefaults choisit ses préférences?

S'il vous Plaît dites-moi si je me trompe.

24
demandé sur Piyush Dubey 2012-01-10 14:53:59

5 réponses

NSUserDefaults sont utilisés pour enregistrer de petites portions de données de l'Application dépend de fonctionner correctement, tandis que d'autres approches sont bonnes pour stocker de plus grandes quantités de données, que l'application de travailler avec.

NSUserDefaults makes est incroyablement facile, car vous n'avez pas à vous soucier des fichiers, des entités, des récupérations,.... Il est tout fait en une seule ligne.

14
répondu vikingosegundo 2012-01-10 11:21:24

Une chose qui n'a pas encore été mentionnée: NSUserDefaults supporte tous les types scalaires de base (float, int, BOOL), ainsi que les types compatibles plist: NSData, NSString, NSNumber, NSDate, NSArray et NSDictionary. (Vous avez mentionné plists comme alternative--NSUserDefaults est juste un front-end à un fichier plist standard dans le dossier Préférences de l'application.) Cela facilite la création d'un stockage persistant pour l'état de votre application en quelques lignes de code. Encore mieux, si vous implémentez NSCoding sur vos objets de modèle, vous pouvez les archiver dans un NSData et les mettre dans NSUserDefaults:

NSData* data = [NSKeyedArchiver archivedDataWithRootObject:arrayOfModelObjects];

[[NSUserDefaults standardUserDefaults] setObject:data forKey:kDefaultsKeyModelObjects];

Et la restauration des données de votre application est aussi simple que

- (void)viewDidLoad
{
    NSData* data = [[NSUserDefaults standardUserDefaults] objectForKey:kDefaultsKeyModelObjects];

    arrayOfModelObjects = [[NSKeyedUnarchiver unarchiveRootObject:data] retain];

    // error checking, tell UI to load the new values, etc...
}

(kDefaultsKeyModelObjects est une constante de chaîne que vous avez définie quelque part. Toujours mettre vos clés NSUserDefaults en un seul endroit! Avoir une faute de frappe dans un nom de clé peut prendre des heures à déboguer. :)

Si vous avez utilisé, par exemple, SQLite pour stocker vos données d'application, vous devez écrire beaucoup de code pour déplacer vos données de modèle la base de données. Cela a du sens si vous avez affaire à beaucoup de données, si vous avez besoin d'une recherche efficace, etc.; mais si c'est, disons, une liste de serveurs dans une application de réseau, il est plus facile et plus propre à les jeter dans NSUserDefaults.

Une dernière chose: NSUserDefaults est idéal pour le prototypage. Même si vous savez que vous aurez besoin d'un magasin SQLite, vous pouvez commencer à utiliser NSUserDefaults comme un magasin persistant rapide et facile, et faire fonctionner votre interface utilisateur et étoffer votre modèle de données avant d'écrire un tas de code de base de données.

Donc, comme Mac OS X, iOS a-t-il également plusieurs utilisateurs et en fonction de celui qui est connecté NSUserDefaults choisit ses préférences ?

Non, sur iOS, le plist defaults se trouve dans le dossier Library/Preferences de l'application, pas dans un dossier spécifique à L'utilisateur comme sur OS X. Je ne peux pas imaginer que iOS aura plusieurs connexions, mais vous ne savez jamais. Si c'était le cas, ils devraient faire des plists par défaut séparées pour différents utilisateurs.

15
répondu davehayden 2012-02-23 19:46:25

C'est à l'origine pour stocker les paramètres, mais semble être utilisé pour beaucoup d'autres choses si les questions sur SO sont quelque chose à passer. Le "point" de celui-ci est qu'il fournit une méthode de persistance et de récupération de données sur une seule ligne pour un large éventail de types de données.

Il N'y a pas de configuration multi-utilisateur (encore?) sur iOS (avez-vous déjà eu à vous connecter à votre iPhone?) qui est construit dans NSUserDefaults, mais parce que OS X et iOS sont construits sur la même base, la même classe est utilisé pour les deux systèmes d'exploitation.

5
répondu jrturton 2012-01-10 11:18:49

IOS est un système d'exploitation mono-utilisateur. Par conséquent, NSUserDefaults est utilisé différemment dans OSX et iOS.

Dans iOS, vous utilisez normalement NSUserDefaults pour enregistrer les préférences d'application et / ou les données utilisateur sur le "système par défaut iOS". Les données enregistrées dans le système par défaut seront persistantes à tout moment même lorsque vous redémarrez l'appareil iOS. En fait, même lorsque l'utilisateur met à jour l'application.

Vous souhaitez généralement utiliser NSUserDefaults pour enregistrer les préférences/paramètres de l'application. Toute autre les données massives telles que les données de jeu ou les calculs en temps réel doivent être sauvegardées dans CoreData ou sqllite dans le répertoire documents.

3
répondu Semere Taézaz Sium 2012-01-10 11:20:38

NSUserDefaults valeurs stockées uniquement pour votre application.

Note - il n'est pas destiné à remplacer un magasin traditionnel de données (Core Data, SQLite, listes de propriétés, etc. sont destinés à stocker des données d'application). Ce à quoi NSUserDefaults est destiné est pour des paires de valeurs clés spécifiques.

Par exemple, je l'utilise pour stocker l'ID réseau et le nom complet d'un utilisateur authentifié une fois le processus de connexion terminé. Lors du délai d'attente ou de la déconnexion de la session, j'efface ces valeurs. Pour cela NSUserDefaults brille.

1
répondu LJ Wilson 2016-01-11 09:26:22