2016-09-09 19 views
16

Po uaktualnieniu do Xcode 8 GM dzisiaj zauważyłem, że NSLog nie drukuje całego komunikatu do konsoli. Jest to szczególnie widoczne w przypadku pracy z interfejsem API, który pobiera wiele informacji, takich jak REST API, pobiera wszystkie produkty z bazy danych, pokazuje tylko 30 pierwszych kluczy w pierwszym produkcie, pozostałe informacje są przycinane ...Xcode 8 Nie wyświetla całego wyjścia NSLog

Drukuję tablice i słowniki, jeśli to ma znaczenie.

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

Czy ktoś jeszcze to zauważył? I czy ktoś wie, jak to naprawić?

+0

Mam ten sam problem i nie mogę tego rozgryźć! Nie drukuję dictów, to jest moje - używane do drukowania całego łańcucha, teraz tylko wypisuje 1028 znaków za każdym razem: NSLog (@ "Dane:% @", [[NSString alloc] initWithData: kodowanie danych: NSUTF8StringEncoding]) ; – lomokat

+0

Czy to również się zaczęło po aktualizacji do xCode 8? – Pointblaster

+0

yup rozpoczął się dopiero po xcode 8 GM. Nie zauważyłem tego w ostatniej wersji beta. – lomokat

Odpowiedz

7

Jak powiedział @Lion w swoim komentarzu, najłatwiejszym sposobem jest użycie printf. To nie działa dokładnie tak jak NSLog, ale pokazuje, czego chcesz.

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

lub krócej:

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

Końcówka jest umieszczenie „\ n” na początku lub na końcu formatu printf więc będzie oddzielić wyjść i nie umieścić wszystkie w jednym wierszu . Coś takiego:

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

Jeśli nie lubisz pisać printf zamiast za każdym razem można użyć #define przekierować kod do printf tak (kodem z @xfdai):

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

Mam nadzieję, że to tylko błąd firmy Apple, który zostanie wkrótce naprawiony, do tego momentu możemy go użyć.

0

Możesz użyć tej metody. Podziel co 800 znaków. Lub można ustawić. NSLOG Myślę, że obcięcie co 1000 znaków. Jeśli ciąg jest mniejszy niż 800, użyje prostego NSLog. Jest to przydatne w długich łańcuchach Json i używa konsoli. printf używa okna debugowania Xcode, a nie konsoli.

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

}