내 코드가 작동하기 때문에 코드 기반 개념 이상의 질문이 있습니다.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 확인 및로드 컨트롤러를했고, 둘은 다시 참으로왔다. 같은 컨텍스트와 저장소를 사용하면 같은 배열의 배열을 반환하지 않을 이유가 확실하지 않습니다.
appDelegate의 managedObjectContext 메소드를 표시합니다. 보기 컨트롤러에서 AppDelegate의 managedObjectContext 메서드를 사용합니까, 아니면보기 컨트롤러가 managedObjectContext를 얻기 위해 자체 (다른?) 구현을 가지고 있습니까? – Mario
Apple 가이드 라인에 따라 앱 위임에 컨텍스트를 생성 한 다음 컨트롤러에서 컨트롤러로 전달합니다. Xcode에서 핵심 데이터 응용 프로그램을 수행 할 때 응용 프로그램 대리인에게 제공하는 재고 코어 데이터 스택 메서드를 사용합니다. 컨텍스트가 존재하면 그 컨텍스트가 새로운 것을 생성합니다. –
다른 스레드에서 작업하는 경우 MOC (예 : NSMainQueueConcurrency)에 대한 큐 동시성 유형 중 하나를 사용하고 블록 기반 MC 호출 - 또는 자신의 동기화 구성표를 사용하십시오. 애플 리케이션 델리게이트에 관해서는, 코드는 당신이 그것을 호출하는 모든 스레드에서 실행됩니다. 스레드와 관련하여 클래스에 특별한 것은 없습니다. –