1

비동기 네트워크 작업을 포함하지만 모두 NSManagedObjectContext에 액세스해야하는 몇 가지 "하위 작업"에 의존하는 "동기화"작업이 있습니다. NSManagedObjectContext s의 스레딩 요구 사항으로 인해 이러한 하위 작업 모두가 동일한 스레드에서 실행되어야합니다. 이러한 작업 중 일부에서 처리되는 양 때문에 백그라운드 스레드에 있어야합니다. 순간 어떻게 NSRunLoop을 시작하고 NSAutoreleasePool이 비어 있는지 확인하십시오.

, 내 싱글 SyncEngine 개체의 -init 방법이 작업을 수행하여 새 스레드를 시작 해요 :

[self performSelectorInBackground:@selector(initializeSyncThread) withObject:nil]; 

-initializeSyncThread 방법은 다음과 같습니다

- (void)initializeSyncThread 
{ 
    self.syncThread = [NSThread currentThread]; 
    self.managedObjectContext = [(MyAppDelegate *)[UIApplication sharedApplication].delegate createManagedObjectContext]; 
    NSRunLoop *runLoop = [NSRunLoop currentRunLoop]; 
    [runLoop run]; 
} 

는 이것을인가 이 스레드에 대해 NSRunLoop을 시작하는 올바른 방법은 무엇입니까? 그것을 할 수있는 더 좋은 방법이 있습니까? 실행 루프는 'performSelector'소스를 처리하기 만하면되며, 프로세스의 수명 동안 처리해야합니다.

NSAutoreleasePool을 설정할 때 루프 실행 관찰자를 사용하여 자동 실행 풀을 만들고이를 실행 한 후에 배출해야합니까?

답변

0
비동기 네트워크 작업을 완료하는 데 서로 다른 시간이 걸릴 수 있기 때문에

나는이 문제를 해결하는 가장 효율적인 방법입니다 100 % 확실하지 않다,하지만이 같은 일을 해요 ...

(또는에 timeout) 인스턴스 변수 (이 경우에는 callComplete이라고하는 BOOL)를 추적합니다.

네트워크 reqeust를 시작하는 코드가 시작되고 내 NSURLConnection이 사라지고 마술을 수행 할 때까지 기다립니다. 전화가 이렇게 완료됩니다.

while(!callComplete && [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]){ 
    // Here you can perform other checks, like making sure the method isn't running forever (with a timeout variable) 
    // Just set callComplete to YES when done 
} 
0

NSAutoreleasePool과 관련하여 배경에서 실행되는 선택기의 시작 부분에 하나만 만들면됩니다. 그런 다음 실행 루프가 완료된 후 (그리고 내 통화가 완료되면) 돌아 오기 전에 평상시처럼 풀어 듭니다.

+0

나는 백그라운드 스레드에 자동 복구 풀이 필요한 7-8 가지 방법이있다. CocoaTouch가 Main Thread를 위해하는 것처럼 실행 루프 자체에서 설정하고 배수 할 수있는 방법이 있다면 분명 바람직 할 것입니다. –

+0

실행 루프 관측기를 사용하여 이벤트 처리가 완료된 시점을 알 수 있다고 생각합니다. 자세한 정보는 Apple 문서를 참조하십시오. – InFreefall

관련 문제