2012-11-15 7 views
1

db 동기화 메커니즘이있는 앱에서 작업 중입니다.백 그라운드 처리를 위해 GCD 사용

[NSThread detachNewThreadSelector:@selector(sync) 
         toTarget:[SyncService sharedInstance] 
         withObject:nil]; 

을 다음 그러나 여기에서 문제는, 동기화가 백그라운드에서 실행되지대로

나는 동기화 서비스를 호출했다. 결과 응용 프로그램

동기화가 완료 될 때까지 유휴 상태가됩니다. 그래서, 배경

처리를 GCD를 사용하여 생각하고 다음

dispatch_async(dispatch_get_global_queue(0, 0), ^{ 

    [[SyncService sharedInstance]Sync]; 

}); 

를했지만 지금도 동기는 background.I에 동기화가

백그라운드에서 수행 할 수행되지 않습니다 .

편집 : 내가 사용 해달라고 할 때마다

[NSThread detachNewThreadSelector : @selector (동기화)

       toTarget:[SyncService sharedInstance] withObject:nil];, 

바로 다음 줄 [[[SyncService sharedInstance] 위임] addObject : 자기] 아니요

이라고합니다. 이것은 GCD (전역 큐)를 사용할 때 호출되지 않습니다.

도움을 주시면 대단히 감사하겠습니다.

답변

1

당신은 잘못된 속성을 사용하여 dispatch_get_global_queue 메소드를 호출하는 첫 번째 0 DISPATCH_QUEUE_PRIORITY_DEFAULT 의미 또는 우선 순위의 다른 미리 정의 : DISPATCH_QUEUE_PRIORITY_HIGH, DISPATCH_QUEUE_PRIORITY_DEFAULT, DISPATCH_QUEUE_PRIORITY_LOW 또는 DISPATCH_QUEUE_PRIORITY_BACKGROUND을. .

당신은 그것을 좋아 호출해야합니다 :

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    [[SyncService sharedInstance]Sync]; 
}); 

는 또한 문서 +detachNewThreadSelector:toTarget:withObject:를 호출하면 새 스레드를 시작한다고. UI를 차단하는 것이 아무것도 없는지 확인하십시오. 그리고 당신은 sync 메쏘드에서 무엇을합니까? 당신은 메인 스레드를 호출합니까? 이는 주 스레드/대기열이 다시 차단된다는 것을 의미 할 수 있습니다. 당신은 아무것도 당신의 동기화 방법

+0

아니, 난 여전히 동기화의 주 스레드를 호출하고 있지 않다 메인 스레드에서 수행되지 않습니다 있는지 확인해야한다고 말했습니다 rckoenes으로

[[SyncService sharedInstance] performSelectorInBackground:@selector(Sync) withObject:nil] 

: – Raj

+1

@rckoenes'dispatch_get_global_queue()'는 모든 대기열 우선 순위 유형에 대한 백그라운드 대기열을 반환합니다. 문서를 확인하십시오. 백그라운드 우선 순위는 단순히 가장 낮은 우선 순위를 가짐을 의미합니다. 그의 싱글 톤에서 뭔가가 일어나고 있습니다, 나는 용의자가 될 것입니다. –

+0

그러면 UI를 차단하는'Sync'라는 메소드가 아닙니다. – rckoenes

0

는이 시도가 무언가가 차단되고 있습니다.
관련 문제