J'ai besoin de générer une valeur int qui ne se répète jamais (du moins théoriquement). Je sais qu'il existe arc4random () fnc, mais je ne sais pas comment l'utiliser avec une date ou un numéro en cours :(
Cela retourne une clé unique très similaire à l'UUID générée dans MySQL.
+ (NSString *)uuid
{
CFUUIDRef uuidRef = CFUUIDCreate(NULL);
CFStringRef uuidStringRef = CFUUIDCreateString(NULL, uuidRef);
CFRelease(uuidRef);
return [(NSString *)uuidStringRef autorelease];
}
Version ARC:
+ (NSString *)uuid
{
CFUUIDRef uuidRef = CFUUIDCreate(NULL);
CFStringRef uuidStringRef = CFUUIDCreateString(NULL, uuidRef);
CFRelease(uuidRef);
return (__bridge_transfer NSString *)uuidStringRef;
}
Une version simple pour générer un UUID (iOS 6 ou version ultérieure).
Objectif c:
NSString *UUID = [[NSUUID UUID] UUIDString];
Swift 3+:
let uuid = UUID().uuidString
Il générera quelque chose comme 68753A44-4D6F-1226-9C60-0050E4C00067, unique à chaque fois que vous appelez cette fonction, même sur plusieurs périphériques et emplacements.
Si vous utilisez CoreData pour enregistrer les parties jouées, la variable NSManagedObject
de objectID
devrait vous convenir sans effort supplémentaire.
Vous pouvez créer une catégorie de UIApplication, UIDevice ou comme vous le préférez (exemple ARC)
@interface UIApplication (utilities)
- (NSString*)getUUID;
@end
@implementation UIApplication (utilities)
- (NSString*)getUUID {
NSUserDefaults *standardUserDefault = [NSUserDefaults standardUserDefaults];
static NSString *uuid = nil;
// try to get the NSUserDefault identifier if exist
if (uuid == nil) {
uuid = [standardUserDefault objectForKey:@"UniversalUniqueIdentifier"];
}
// if there is not NSUserDefault identifier generate one and store it
if (uuid == nil) {
uuid = UUID ();
[standardUserDefault setObject:uuid forKey:@"UniversalUniqueIdentifier"];
[standardUserDefault synchronize];
}
return uuid;
}
@end
UUID () est cette fonction
NSString* UUID () {
CFUUIDRef uuidRef = CFUUIDCreate(NULL);
CFStringRef uuidStringRef = CFUUIDCreateString(NULL, uuidRef);
CFRelease(uuidRef);
return (__bridge NSString *)uuidStringRef;
}
cela génère un identifiant unique stocké dans le NSUserDefault à réutiliser chaque fois que l’application en a besoin - Cet identifiant sera unique et lié à l’installation de l’application, mais peut être utilisé par exemple pour tracer le nombre de périphériques abonnés au service APN, etc. ...
Après cela, vous pouvez l'utiliser de cette manière:
NSString *uuid = [[UIApplication sharedApplication] getUUID];
Un horodatage simple (millisecondes * 10) devrait faire l'affaire:
self.uid = [NSNumber numberWithInteger:[NSDate timeIntervalSinceReferenceDate] * 10000];
Vous pouvez utiliser le temps en millisecondes ou de manière plus avancée GUID .
Vous n'avez pas dit que ça doit être aléatoire. Alors, pourquoi ne pas commencer par un nombre, puis ajouter simplement 1 au dernier nombre que vous avez généré.
Cette méthode devrait vous donner au moins 4 milliards de numéros uniques pour commencer:
-(NSInteger)nextIdentifies;
{
static NSString* lastID = @"lastID";
NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
NSInteger identifier = [defaults integerForKey:lastID] + 1;
[defaults setInteger:identifier forKey:lastID];
[defaults synchronize];
return identifier;
}
Si vous avez un NSDictionary, vous pouvez générer un identifiant progressif à partir du dernier élément:
NSInteger maxKey = -1;
for(NSString *key in [YOUR_DICTIONARY allKeys])
{
NSInteger intKey = [key integerValue];
if(intKey > maxKey)
{
maxKey = intKey;
}
}
NSString *newKey = [NSString stringWithFormat:@"%d", maxKey + 1];
Vous devez faire attention, surtout si vous utilisez les routines d'incrémentation par 1, que si votre application est supprimée et rechargée sur l'iDevice, vous ne disposerez plus de votre numéro par défaut enregistré. Cela recommencera depuis le début. Si vous enregistrez les scores des utilisateurs, vous pouvez également enregistrer le nombre le plus élevé. Mieux vaut vérifier les routines de temps pour les secondes (ou millisecondes) après une certaine date. Le GUID mentionné ci-dessus est également utile si vous avez besoin de ce type d'unicité.