좋아, 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)이 있습니다.
collectData
과 processArray
의 두 가지 기능이 있습니다. 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에서 복사된다는 것입니다.
디버그 플래그가 없습니다. 그것은 같은 코드입니다. 지금 당장은 해결 방법을 찾았지만 문제를 해결할 수있는 질문에는 대답하지 않습니다. 나중에 코드를 추가합니다. – Fogmeister