web-dev-qa-db-ja.com

Xcode 8NSLog出力全体を表示しません

Xcode 8にアップグレードした後、GM今日、NSLogがログメッセージ全体をコンソールに出力していないことに気付きました。これは、次のような多くの情報をダウンロードするAPIに対して作業する場合に特に顕著です。 a REST APIはデータベースからすべての製品をダウンロードします。最初の製品の最初の30個のキーのみが表示され、残りの情報はクリップされます...

違いがあれば、配列と辞書を印刷しています。

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

他の誰かがこれに気づきましたか?そして、誰かがこれを修正する方法を知っていますか?

18
Pointblaster

@Lionが彼のコメントで説明しているように、最も簡単な方法は、代わりにprintfを使用することです。 NSLogとまったく同じようには機能しませんが、必要なものが表示されます。

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

以下:

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

ヒントは、printf形式の最初または最後に「\ n」を配置して、出力を分離し、すべてを1行にまとめないようにすることです。このようなもの:

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

代わりに、毎回printfを作成したくない場合は、#defineを使用してコードを次のようなprintfにリダイレクトできます(@xfdaiのコード)。

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

うまくいけば、これはAppleのバグであり、すぐに修正され、それまではこれを使用できます。

11
Pointblaster

この方法を使用できます。 800文字ごとに分割します。または設定することができます。 NSLOG1000文字ごとに切り捨てると思います。文字列が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);
        }

}
0
Andy Vene