2014-11-19 2 views
0

Objective C의 일반적인 패턴은 백그라운드 스레드에서 약간의 코드를 실행 한 다음 메인 스레드로 돌아가서 UI를 조정하는 것입니다. 코드는 메인 스레드에서 시작하면, 내가 너무 같은 패턴이 공격 것 :백그라운드로 코드를 보내고, 기다리지 않고, 차단하지 않고 주 스레드로 돌아 간다?

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    [self someBackgroundTask]; 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     [self someUITask]; 
    }); 
}); 

그러나,이 그것을 할 수있는 정말 어설픈 방법처럼 보인다 아닌 이상에서이 두 가지 수준을 생성하기 때문에 그 느낌이 불필요하게 중첩됩니다. 이 작업을 수행하는 더 좋은 방법이 있습니까? 이 경우 UI 코드는 백그라운드 작업 완료에 의존하므로 첫 번째 디스패치 후에 삭제할 수 없습니다.

+0

메인 스레드에서 someUITask를 실행하도록 NSThread에 요청할 수 있습니다. 그러나 그것은 정말 지저분 해집니다. 일반적으로 블록이 좋습니다. 또한 블록은 NSThread보다 100 배 더 빠른 것입니다. –

+0

은 _GCD_를 사용하는 올바른 방법으로 보이지만 아무 것도 필요하지 않습니다. 실제 문제는 무엇입니까? – holex

답변

0

개념적으로 두 개의 다른 스레드에서 코드를 실행해야합니다. 모든 UI 작업은 주 스레드에서 실행해야하며 차단 작업은 백그라운드 스레드에서 실행해야합니다. 절대 최소값에서는 두 줄의 코드가 필요합니다.

GCD는 언급 한 것처럼 간단합니다. 이 핵심 문제를 해결할 더 좋은 방법이있는 언어가 있는지 확신 할 수 없습니다. 물론 블록 구문이 잘못되었습니다 (http://fuckingblocksyntax.com). 그러나 근본적인 기초는 꽤 단단합니다.

중첩으로 인해 괴롭히는 경우 해당 UI 코드를 다른 방법으로 이동하고 두 번째 중첩 된 블록에서 해당 메서드를 호출 해보십시오. 'backgroundWork' 선택기/블록 및 'foregroundWork' 선택기/블록을 허용하는 메서드를 만들 수도 있습니다. 그러나 나는 그런 경우에 수행 할 수있는 전형적인 UI 작업은 매우 미미하여 추가 중첩이 실제 문제가 아닌 사소한 불편을 낳는다 고 주장한다.

상호 의존적 인 비동기 코드 블록까지 PromiseKit 또는 심지어 시퀀서를 체크합니다. 둘 다 Objective C의 주요 취약점 (순차적으로 수행되는 멀티 스레드 작업) 중 하나를 보완하는 좋은 옵션입니다.

내가 직접 사용하지 않은,하지만 난 페이스 북/구문 분석도 볼트 프레임 워크의 또 다른 BFTask라는 솔루션, 일부 발표 한 것으로 알고 : https://github.com/BoltsFramework/Bolts-iOS

을 (또는 C#을 사용)

+1

글쎄, 개념적으로 동기식 디스패치입니다.이 코드는 메서드가이 스레드에서 계속되기 전에 다른 스레드에서 실행해야합니다. 그것은 기술적으로 하나의 라인이어야하며 두 개가되어야합니다. 문제는 메인 쓰레드에서 dispatch_sync를 실행하면 전체 메인 쓰레드가 멈추어 서 기다리는 것입니다. 근본적으로는 의미가 있지만, 그렇게 추한 것은 아닌 유사한 구문으로 처리하는 방법을 찾고있었습니다. – puzzl

+0

PromiseKit 및 시퀀서가 작동하지 않으면 Bolts/BFTask를 체크 아웃하십시오 (원래 코멘트에 대한 링크가 추가됨). – cdstamper

0

그냥 이동을 someBackgroundTask에 모든 스레딩 물건 :

[self someBackgroundTaskWithCompletion:^{ 
    [self someUITask]; 
}]; 

그런 다음 백그라운드 작업 방법 내부에 dispatch_async() 물건을 할.

관련 문제