2012-11-28 3 views
4

좋아, TechnicalQuery이라는 Entity 인 coreData 모델이 있습니다. 이처럼 ... 응용 프로그램에서이상한 CoreData 디버그 대 릴리스 문제

TechnicalQuery 
-------------- 
NSString *detail 
NSDate *createdDate 
NSString *solution 
NSString *name 
... 

은 동기화 과정 (응용 프로그램이 사양으로 오프라인)가 다시 연결 사무실에있을 때 동기화됩니다 응용 프로그램을 사용하는 사람입니다. 어쨌든, 그건 중요하지 않습니다.

동일한 이름을 사용하여 TechnicalQuery에 대해 NSManagedObject 서브 클래스를 생성했습니다.

@property 세부 정보와 @dynamic 세부 정보가 정의되어 있습니다.

현재 DB에 기술적 인 쿼리가 하나만 있습니다. 응용 프로그램을 사용하여 기술 정보 "화면"을 자세히 볼 수 있습니다 ... 이름, 솔루션, 세부 사항, 작성 날짜 등을 표시합니다 ... 모든 것이 있습니다.

앱의 솔루션 텍스트를 업데이트 할 수 있습니다. 그런 다음 나중에 다시 돌아 오면 업데이트가 계속 남아 있습니다. 핵심 데이터가 올바르게 작동합니다.

서버에 다시 동기화 할 때 내 문제가 발생합니다.

디버그에서 정상적으로 작동합니다. 백그라운드 스레드에 동기화 프로세스를 보냅니다. 그런 다음이 스레드는 마지막 동기화 이후 업데이트 된 TQ를 찾은 다음 데이터를 JSON 데이터로 변환합니다. 그런 다음 다른 큐를 시작하고이 TQ에 대한 모든 업로드를 큐에 대기시킵니다.

참고! 어떤 시점에서도 스레드간에 ManagedObjects이 전달됩니다. 한 함수에서 fetchrequest를 실행 한 다음 배열을 저장하고 다음 함수 (동일한 스레드)에서 배열을 처리합니다. 다음 스레드로 전달되는 유일한 것은 JSON 데이터 및 개체 고유 URL이며, CoreData 개체가 전혀 전송되지 않아야합니다.

json으로 데이터는 함수는 먼저이 요구하는 형식과 일치하는 NSDictionary에 객체를 변환 (가 NSManagedObject에 대한 범주에 사실입니다하지만 ... 생각을)를 ManagedObject 서브 클래스 파일의 기능에 의해 수집됩니다 서버로 변환 한 다음 변환합니다.) 즉, 내 아이폰 5 엑스 코드에서 직접 실행 디버그 모드에서 어쨌든

은 (는. 사전을 잘 작동 (및 업로드 데이터는 모두 인구가 괜찮습니다. 그러나

, (마침내 거기에 도착)에서 실행하는 경우 릴리스 모드 (즉, 내가 계측기에서 프로파일을 작성할 때) NSDictionary 폭탄을 생성하는 함수. "detail"속성이 없음을 알립니다. 내가 NSLog 속성 일 때 릴리스 모드에서 nil이라고 표시되지만 텍스트 (디버그 모드에서)

<Warning>: Exception! *** setObjectForKey: object cannot be nil (key: Detail) 

나는 이것이 일어나는 정확한 라인을 알고 있으며, NSMutableDictionary에서 키에 대한 개체를 보내십시오.

일반적으로 어딘가에 속성을 설정하지 않았는지 확인 하겠지만 TQ 페이지를 다시 탐색하여 세부 텍스트가 제대로 표시 될 수 있으므로 확실히 설정됩니다.

나는 지금 어디로 가야할지 잘 모르겠다.

누구나 멋진 정보를 어디서 찾을 수 있는지 조언 해 줄 수 있다면.

:: 편집 1 :

OK,이 기괴한입니다.

데이터 수집 및 처리중인 개체에 강력한 레코드 배열 (recordArray)이 있습니다.

collectDataprocessArray의 두 가지 기능이 있습니다. collectData 함수는 가져 오기 요청을 실행하고 결과를 recordArray에 넣습니다. processArray 함수는 배열을 반복하고 각 항목을 처리합니다.

배열에있는 데이터를 collectData에 기록하면 올바르게 표시됩니다.

같은 배열의 동일한 데이터를 processArray에 기록하면 개체가 여전히 배열에 있지만 속성은 모두 null입니다.

감사

: EDIT 2 ::

I는 속성 배열 제거 및 입력/출력 패턴을 대체하기 시도했다.

즉, collectData 함수의 출력 배열을 입력 한 다음 processArray 함수에 입력합니다.

여전히 동일한 결과가 나타납니다.

정말 이걸로 내 머리카락을 꺼내.

다시 한번 감사

:: 편집 :

3 그냥 NSLog 항목에서 일부 콘솔 로그를 추가.

1. Nov 29 09:56:39 Olivers-iPhone5 [2705] <Warning>: Collecting technical queries 
2. Nov 29 09:56:39 Olivers-iPhone5 [2705] <Warning>: Tech Query: Name: test Detail: Test description from Olivers iPhone. 
3. Nov 29 09:56:39 Olivers-iPhone5 [2705] <Warning>: pushing tech queries 
4. Nov 29 09:56:39 Olivers-iPhone5 [2705] <Warning>: Tech Query: Name: (null) Detail: (null) 
5. Nov 29 09:56:39 Olivers-iPhone5 [2705] <Warning>: (null) 
6. Nov 29 09:56:39 Olivers-iPhone5 [2705] <Warning>: Exception! *** setObjectForKey: object cannot be nil (key: Detail) 
7. Nov 29 09:56:39 Olivers-iPhone5 [2705] <Warning>: Something Went Wrong! 

이러한 현상은 모두 1 초 내에 발생합니다.

2 행은 collectData 함수 내부에서 Tech Query의 이름 및 상세 특성 NSLog입니다.

라인 4는 processArray 함수 내부의 Tech Query의 이름과 상세 속성의 NSLog입니다.

위에서 볼 수 있듯이 4 행에는 등록 정보의 null 값이 표시됩니다.

Line 6은 detail 속성을 NSMutableArray에 추가하려고 시도한 예외 로그입니다. detail 속성이 null이기 때문에 잘못되었습니다. 스레드 ID와 로그를 추가

:: 편집 4 :

.

1. Nov 29 10:32:08 Olivers-iPhone5 [2749] <Warning>: Collecting technical queries. Thread: <NSThread: 0x1d263fa0>{name = (null), num = 8} 
2. Nov 29 10:32:08 Olivers-iPhone5 [2749] <Warning>: Tech Query: Name: test Detail: Test description from Olivers iPhone. Thread: <NSThread: 0x1d263fa0>{name = (null), num = 8} 
3. Nov 29 10:32:08 Olivers-iPhone5 [2749] <Warning>: pushing tech queries. Thread: <NSThread: 0x1d263fa0>{name = (null), num = 8} 
4. Nov 29 10:32:08 Olivers-iPhone5 [2749] <Warning>: Tech Query: Name: (null) Detail: (null) Thread: <NSThread: 0x1d263fa0>{name = (null), num = 8} 
5. Nov 29 10:32:08 Olivers-iPhone5 [2749] <Warning>: (null) 
6. Nov 29 10:32:08 Olivers-iPhone5 [2749] <Warning>: Exception! *** setObjectForKey: object cannot be nil (key: Detail) 
7. Nov 29 10:32:08 Olivers-iPhone5 [2749] <Warning>: Something Went Wrong! 

여기에서 볼 수 있듯이 스레드 간에는 아무 것도 전달하지 않습니다. 이것은 모두 같은 스레드에서 발생합니다.

다시 한번 감사드립니다.

:: 편집 5 ::

그냥 내가 이것을 만드는 아니에요 방법, 여기에 로그가

1. 2012-11-29 10:36:08.471 [2767:161f] Collecting technical queries. Thread: <NSThread: 0x1cd52fb0>{name = (null), num = 8} 
2. 2012-11-29 10:36:08.474 [2767:161f] Tech Query: Name: test Detail: Test description from Olivers iPhone. Thread: <NSThread: 0x1cd52fb0>{name = (null), num = 8} 
3. 2012-11-29 10:36:08.474 [2767:161f] pushing tech queries. Thread: <NSThread: 0x1cd52fb0>{name = (null), num = 8} 
4. 2012-11-29 10:36:08.475 [2767:161f] Tech Query: Name: test Detail: Test description from Olivers iPhone. Thread: <NSThread: 0x1cd52fb0>{name = (null), num = 8} 
5. 2012-11-29 10:36:08.476 [2767:161f] Test description from Olivers iPhone. 
6. 2012-11-29 10:36:08.483 [2767:1623] Uploading to url <I can't put the URL here as it's private> 
7. 2012-11-29 10:36:08.906 [2767:520f] Upload Done 

이 정확히 동일합니다 ... 디버그 빌드에서 당신을 보여 암호. 유일한 차이점은 디버그 모드에서 실행 중이며 로그는 Organizer 장치 로그 대신 Xcode에서 복사된다는 것입니다.

답변

0

Fogmeister,

정말 많은 정보를 제공하지 않았습니다. 이와 같이 누구나 추측 할 것입니다.

먼저 코드의 릴리스 버전을 디버깅 할 수 있습니다. Xcode 구성에서 구성 프로파일을 변경하기 만하면됩니다.

둘째, 릴리스 모드로 전환하면 코드가 어떻게 바뀌나요? 디버그 컴파일 시간 플래그를 변경하면 제품이 변경되는 이유는 무엇입니까? (DEBUG 플래그를 던질 때 핵심 데이터가 변경되지 않으므로 문제가되지는 않습니다.)

SO 커뮤니티는 일반적으로 몇 가지 코드가 필요합니다. 일부를 공유하는 경우 사람들은 아마 당신을 도울 것입니다.

앤드류

+0

디버그 플래그가 없습니다. 그것은 같은 코드입니다. 지금 당장은 해결 방법을 찾았지만 문제를 해결할 수있는 질문에는 대답하지 않습니다. 나중에 코드를 추가합니다. – Fogmeister

1

나는 최종 답변을 모르지만, 이것은 당신이 솔루션에 가까워 도움이 될 수 있습니다.

디버그릴리스 구성에서 다른 동작이 있다는 것을 알고 있습니다. 모두이고 다른 하나는 입니다. 빌드 설정과 다른 플레이어로 시도해보십시오.

나는 한번도 으로 비슷하게 이상한 문제가있었습니다. 최적화 수준"가장 빠름, 가장 작음"으로 변경 한 후 디버그에도 버그가 재현되었습니다.

+0

고마워, 내가 살펴볼 게. – Fogmeister

3

문제가 정확히 무엇인지 대답 할 수 없지만이 문제는 나에게 떠오르며, 메인이 아닌 스레드가 어떻게 든 디버그 된 상태에서 최적화 된 상태로 관리 객체 컨텍스트를 유지하지 못하는 것으로 나타났습니다. 현재 NSThread의 threadDictionary를 사용하여 스레드 라이프 사이클 전체에서 관리 대상 객체 컨텍스트를 유지하고 문제가 해결되었습니다.

관련 문제