2013-02-12 2 views
1

내 코드가 작동하기 때문에 코드 기반 개념 이상의 질문이 있습니다.CoreData 가져 오기 요청이 빈 배열을 반환합니다.

내 응용 프로그램이 시작되면 coreData에서 sessionObject를 가져 와서 authToken의 유효성을 검사합니다.

이 코드는로드 컨트롤러에있을 때 작동합니다. 가져 오기 요청이 작동하고 sessionObject 배열을 반환합니다. 그러나 App Delegate에서 authToken의 유효성을 검사 한 곳은 반환 된 배열이 비어 있습니다. 컨트롤러에서 코드가 작동하지만 App Delegate에서는 작동하지 않는 이유는 무엇입니까? 페치 요청에서 오류가 없습니다. 컨텍스트가 0이 아닙니다. 로딩 컨트롤러에서 사용하는 정확한 코드이며 작동합니다.

응용 프로그램 대표단에서 CoreData에 대한 요청을 다르게해야합니까? App Delegate에서 가져 오기 요청을 사용할 수 있습니까?

응용 프로그램의 예제 코드 DeleBate DidBecomeActive 메서드. DidBecomeActive를 사용하여 배경과 init에서 돌아올 때 유효성을 검사 할 수 있습니다.

// check for valid authtoken if present so the correct home screen will display 
NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"CurrentSession" inManagedObjectContext:[self managedObjectContext]]; 

[request setEntity:entity]; 
CurrentSession *sessionObj = nil; 
NSError *cdError = nil; 
if([self managedObjectContext] == nil){ 
    NSLog(@"context is nil"); 
} 
NSArray *sessionArray = [[[self managedObjectContext] executeFetchRequest:request error:&cdError] mutableCopy]; 
if (sessionArray != nil && [sessionArray count]) { 

    sessionObj = (CurrentSession *)[sessionArray lastObject]; 
      NSLog(@"Found session %@",sessionObj.authToken); 
    if (![sessionObj.authToken isEqualToString:@""]) { 
     [Solid_Utilities validateAuthToken:[self managedObjectContext]]; 
    } 
} else { 
    NSLog(@"NO SESSION FOUND"); 
} 

편집 나는 내 문제가 스레드 관련이있을 수 있습니다 확신합니다. 로딩 컨트롤러에서 별도의 스레드에서 많은 작업을 실행하고 App Delegate가 주 스레드에서 실행된다고 가정합니다. 그러나 로딩 컨트롤러에 제공하는 컨텍스트는 응용 프로그램 대리인에서 생성됩니다.

편집 은 내가 응용 프로그램 위임에 isMainThread 확인 및로드 컨트롤러를했고, 둘은 다시 참으로왔다. 같은 컨텍스트와 저장소를 사용하면 같은 배열의 배열을 반환하지 않을 이유가 확실하지 않습니다.

+0

appDelegate의 managedObjectContext 메소드를 표시합니다. 보기 컨트롤러에서 AppDelegate의 managedObjectContext 메서드를 사용합니까, 아니면보기 컨트롤러가 managedObjectContext를 얻기 위해 자체 (다른?) 구현을 가지고 있습니까? – Mario

+0

Apple 가이드 라인에 따라 앱 위임에 컨텍스트를 생성 한 다음 컨트롤러에서 컨트롤러로 전달합니다. Xcode에서 핵심 데이터 응용 프로그램을 수행 할 때 응용 프로그램 대리인에게 제공하는 재고 코어 데이터 스택 메서드를 사용합니다. 컨텍스트가 존재하면 그 컨텍스트가 새로운 것을 생성합니다. –

+0

다른 스레드에서 작업하는 경우 MOC (예 : NSMainQueueConcurrency)에 대한 큐 동시성 유형 중 하나를 사용하고 블록 기반 MC 호출 - 또는 자신의 동기화 구성표를 사용하십시오. 애플 리케이션 델리게이트에 관해서는, 코드는 당신이 그것을 호출하는 모든 스레드에서 실행됩니다. 스레드와 관련하여 클래스에 특별한 것은 없습니다. –

답변

0

답변이 다른 문제와 관련되어있는 것처럼 보입니다. 원래 개발자가 코어 데이터 스택을 기본 컨트롤러에 추가했음을 알았고, 앱 델리게이트에서 스택을 사용하여 기본 컨트롤러로 전달했습니다. 기본 콘트롤러는 내 콘텍스트를 자신의 스택으로 덮어 씌울 것이고, 그 때문에 애플 리케이션 델리게이트에서 가져 오기 결과를 얻을 수 없다.

이 프로젝트를 통해 배웠던 것은 앱 위임자에서 컨텍스트를 만들어 첫 번째 컨트롤러로 전달한다는 것입니다. 그런 다음 prepareForSegue 또는 수동으로 컨텍스트를 전달할 때. 또한보기에서 당신이 돌아가서 상점 컨텍스트를 업데이 트하는지 확인 사라질 것입니다. 멀티 스레딩을 수행하는 경우 응용 프로그램 대리인에서 컨텍스트가 nsmainconcurrencytype인지 확인하여 다른 스레드에 대한 자식 컨텍스트를 만들 수 있습니다. 이렇게하면 데이터 결과가 예상대로 유지되고 충돌은 최소화됩니다.

모든 정보를 제공해 주셔서 감사합니다. 당신의 반응은 어리석은 문제를 추적하는 데 도움이되었습니다.

관련 문제