2013-10-02 3 views
0

서버와 ios 장치간에 데이터를 동기화하는 멀티 스레드 응용 프로그램이 있습니다.SQLLite 쿼리에는 결과가 있지만 메서드에서 반환하면 데이터가 손실됩니다.

동기화가 별도의 스레드에서 발생합니다. NSManagedObjectContext에 대한 싱글 톤 패턴을 사용하며 주 스레드에서 만들어집니다. 스레드 문제가 발생하기 시작했고 연구 결과에 따라 컨텍스트가 초기화 된 스레드 외부에서 사용되면 안된다는 것을 알았습니다. 그래서 메인 스레드의 컨텍스트에서 init을 호출하여 동기화 스레드에서 사용했습니다. 그것을 고치기 위해서 나는 다음과 같이했다.

NSPersistentStoreCoordinator을 반환하는 전역 방법을 만들었으며 동기화 스레드에서이 컨디셔너를 사용하여 새 컨텍스트를 만듭니다. 이것은 스레딩 문제를 제거했지만, 이제는 다른 이상한 행동을합니다.

내 동기화 스레드에서 executeFetchRequest 메서드를 호출하고 결과 배열을 다른 메서드로 반환합니다. 디버깅 할 때 93 개의 레코드가 있고 모두 데이터로 채워져 있음을 알 수 있습니다. 그런 다음 반환 된 메서드의 배열을 확인하지만 여전히 93 개의 레코드가 있지만 열 모두에 nil 값이 있습니다. 여기

는 이런 일이 될 이유

+(NSArray *) GetAllRowsInTable:(NSString *) tableName 
{ 
    NSManagedObjectContext *context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; 
    [context setPersistentStoreCoordinator:[Globals GetPersistentStoreCoordinator]]; 

    NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
    [request setEntity:[NSEntityDescription entityForName:tableName inManagedObjectContext:context]]; 
    NSError *error; 
    NSArray *results = [context executeFetchRequest:request error:&error]; 

    return results; 
} 

아무도 알고 있나요 코드를 무엇입니까?

+0

가져 오기 요청을 만들고 실행하는 코드를 게시 할 수 있습니까? –

+0

코드를 게시했습니다. – neo

+0

오류 개체가 설정되어 있습니까? 그렇다면 오류는 무엇입니까? –

답변

0

왜 이런 일이 발생하는지 알고 있습니다. NSManagedObject에서 읽은 후, 나는 다음 결론에 도달했다. ExecuteFetchRequest가 호출되면 오류가 발생한 결과의 배열을 반환합니다. 즉, NSManagedObject에서 valueForKey 메서드를 호출하지 않으면 해당 값이 영구 저장소에서 검색되지 않습니다. 메서드에서 컨텍스트를 만들고 결과가 생성 된 컨텍스트가 존재하지 않는 다른 메서드로 결과를 반환하기 때문에 결과가 없습니다. 모든 결함은 결국 실패하게됩니다.