Xcode 8 Не отображает весь вывод NSLog

После обновления до Xcode 8 GM сегодня я заметил, что NSLog не печатает на консоли все сообщения журнала. Это особенно заметно при работе с API, который загружает много информации, например, REST API загружает все продукты из базы данных, он отображает только первые 30 ключей на первом продукте, остальная информация обрезается...

Я печатаю массивы и словари, если это имеет значение.

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

Кто-нибудь еще заметил это? И кто-нибудь знает, как это исправить?

Ответы

Ответ 1

Как поясняет @Lion в своем комментарии, самым простым способом является использование printf. Он не работает точно так же, как NSLog, но показывает, что вы хотите.

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

или короче:

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

Совет должен поместить "\n" в начале или в конце формата printf, чтобы он отделял выходы и не помещал все в одну строку. Что-то вроде этого:

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

Если вам не нравится писать printf, а каждый раз, когда вы можете использовать #define для перенаправления кода на printf, как это (код из @xfdai):

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

Надеюсь, это просто ошибка от Apple, которая скоро будет исправлена, до тех пор мы можем использовать это.

Ответ 2

Вы можете использовать этот метод. Разделить каждые 800 символов. Или может быть установлен. NSLOG Я думаю, урезать каждые 1000 символов. Если строка меньше 800 будет использовать простой NSLOG. Это полезно для длинных строк Json и использует консоль. printf использует окно отладки Xcode, а не консоль.

-(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);
        }

}