2012-09-10 2 views
0

나는 내 응용 프로그램을 시작할 때 내가 JSON 텍스트에 일부 핵심 데이터 요소 변환 서버로 전송하는 방법 전화NSLog는 문자열이 너무 클 경우 주 스레드 (?)에서 주 스레드를 실행합니까?

applicationDidFinishLaunching 

에, 그래서 서버에 일부 왼쪽 통해 데이터를 전송해야합니다. 때로는 응용 프로그램 충돌로 인해 :

xxxxxx는 시간에 시작하는 데 실패

내 첫번째 생각은 메인 스레드가, 나는이 수도를 실현하는 블록 앱이 출시 될 때 나는 일을하고 있다는 것입니다 NSURLConnection을 사용하여 NSURLConnection을 사용하여 비동기 데이터를 보내고 주 스레드를 차단해서는 안되며, 데이터가 크면 연결이 비동기이므로 응용 프로그램이 충돌하기 쉽습니다. 유일한 의심스러운 코드는 코어 데이터 엔티티에서 JSON 텍스트를 만들 때 NSLog를 사용하여 인쇄하고 하드 코딩 된 큰 json 파일을 사용하려고했습니다. NSLog lin을 주석 처리하면 항상 충돌합니다. e, 충돌하지 않습니다. 시나리오를 바탕으로

, 내가 궁금해 : 나는 그렇게 생각

  1. , NSLog는 관계없이 스레드가 호출 될 때의 주 스레드에서 실행? 그 때 나는 애플의 문서에서 발견 : NSLogv에서

출력이 과정에서 그 단 하나 개의 스레드에서, 직렬화 한 번에 위에서 설명한 쓰기/로깅을 수행 할 수 있습니다. 다음 스레드가 메시지를 쓰거나 기록하기위한 모든 시도는 다음 스레드가 완료되기 전에 완료 될 수 있습니다.

심지어 기본 스레드가 아닌 것을 의미하지만 기본 스레드로 연결되는 일부 긴 문자열은 로깅됩니다.

  1. NSLog의 문자열 크기에 대한 제한 (이론적, 실용적인)이 있습니까? 하드 코딩 된 JSON 파일은 150KB입니다.

감사합니다.

+0

인스트루먼트는 어떤 말을 했습니까? –

+0

이것을 재현하여 디버그 모드를 실행하면 Xcode가 멈추고 커서가 무지개 회 전자로 바뀌고 Xcode를 강제 실행해야합니다. – hzxu

+1

150KB를 기록하려고하는 이유는 무엇입니까? 그것은 완전히 불합리합니다. –

답변

4

GCD 대기열을 사용하고 로그를 비동기 적으로 덤프하십시오.

lqueue = dispatch_queue_create("com.example.logging", NULL) 

이 그것을 사용하여 로그를 작성 :

은 대략, 당신은 직렬 큐 작성해야

dispatch_async(lqueue, ^{ /* write log here */ }) 

내가 그것을 테스트하지 않았다, 그러나 대신 NSLog 당신은 아마 필요합니다 ASL (asl_* 계열의 기능)을 사용합니다.

더 나은 점은 이미 https://github.com/robbiehanson/CocoaLumberjack과 같은 일부 솔루션을 사용하여이 모든 것을 수행하는 것입니다.

0

귀하의 앱이 iOS 감시 타이머에 의해 종료 될 것으로 생각됩니다. 오류 로그를 검사 할 경우 코드 0x8badf00d가 표시되어야합니다. 기본적으로 워치 독 타이머는 앱 시작 및 중지를 감시하며 너무 오래 걸리면 앱을 종료합니다. 방법 중 하나는 applicationDidFinishLaunching 메소드입니다.앱이 시작하는 데 걸리는 시간에 대한 문서는 없지만 몇 초 밖에 걸리지 않습니다.

코드를 다른 방법이나 배경 스레드로 옮기면됩니다. applicationDidFinishLaunching은 가능한 빨리 끝내야합니다.

여기서 0x8badf00d를 검색하면 코드 및 코드 구성 방법에 대해 많은 토론을 할 수 있습니다.