web-dev-qa-db-fra.com

Xcode 8 N'affiche pas l'intégralité de la sortie NSLog

Après la mise à niveau vers Xcode 8 GM aujourd'hui, j'ai constaté que NSLog n'imprimait pas l'intégralité du message de journal sur la console. Ceci est particulièrement visible lorsque vous travaillez avec une API qui télécharge beaucoup d'informations, comme une API REST qui télécharge tous les produits d'une base de données, elle affiche uniquement les 30 premières clés du premier produit, le reste des informations étant: coupé...

J'imprime des tableaux et des dictionnaires, si cela fait une différence.

NSDictionary *allProducts = responseFromAPI;
NSLog(@"All products:%@", allProducts);

Quelqu'un at-il remarqué cela? Et est-ce que quelqu'un sait comment résoudre ce problème?

18
Pointblaster

Comme @Lion l'a décrit dans son commentaire, le moyen le plus simple consiste à utiliser printf à la place. Cela ne fonctionne pas exactement comme NSLog mais cela montre ce que vous voulez.

NSDictionary *allProducts = responseFromAPI;
NSString * string = [NSString stringWithFormat: @"%@", allProducts];
printf("%s", [string UTF8String]);

ou plus court:

NSDictionary *allProducts = responseFromAPI;
printf("%s", [NSString stringWithFormat: @"%@", allProducts].UTF8String);

Une astuce consiste à placer un "\ n" au début ou à la fin du format printf afin de séparer les sorties et de ne pas les placer toutes sur une seule ligne. Quelque chose comme ça:

printf("%s\n", string.UTF8String);

Si vous n'aimez pas écrire printf à la place, vous pouvez utiliser un #define pour rediriger le code vers un printf comme celui-ci (code de @xfdai):

#define NSLog(FORMAT, ...) printf("%s\n", [[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String]);

Espérons que ce n’est qu’un bug d’Apple qui sera corrigé prochainement, jusqu’à ce que nous puissions l’utiliser.

11
Pointblaster

Vous pouvez utiliser cette méthode. Fractionner tous les 800 caractères. Ou peut être réglé. NSLOG Je pense tronquer tous les 1000 caractères. Si la chaîne est inférieure à 800, une simple NSLog sera utilisée. Ceci est utile pour les chaînes longues Json et utilise la console. printf utilise la fenêtre de débogage Xcode et non la console.

-(void) JSLog:(NSString*)logString{

        int stepLog = 800;
        NSInteger strLen = [@([logString length]) integerValue];
        NSInteger countInt = strLen / stepLog;

        if (strLen > stepLog) {
        for (int i=1; i <= countInt; i++) {
            NSString *character = [logString substringWithRange:NSMakeRange((i*stepLog)-stepLog, stepLog)];
            NSLog(@"%@", character);

        }
        NSString *character = [logString substringWithRange:NSMakeRange((countInt*stepLog), strLen-(countInt*stepLog))];
        NSLog(@"%@", character);
        } else {

        NSLog(@"%@", logString);
        }

}
0
Andy Vene