Xcode 8不显示整个NSLog输出

时间:2016-09-09 13:39:50

标签: ios objective-c xcode nslog

今天升级到Xcode 8 GM后,我注意到NSLog没有将整个日志消息打印到控制台。当针对下载大量信息的API工作时尤其明显,例如REST API从数据库下载所有产品,它只显示第一个产品的前30个键,其余信息被剪切...

我正在打印数组和字典,如果这有任何区别的话。

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

有没有人注意到这个?有人知道如何解决这个问题吗?

2 个答案:

答案 0 :(得分:11)

正如@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的一个错误,很快就会修复,直到那时我们才能使用它。

答案 1 :(得分:0)

您可以使用此方法。每800个字符分开。或者可以设置。 NSLOG我认为截断每1000个字符。如果string小于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);
        }

}