2014-05-21 6 views
2

GCD 및 스레드에 대해 알고 싶습니다.GCD 및 스레드

내 비동기 네트워크 요청을 수행하도록 내 모델에 요청하는 뷰 컨트롤러에 for 루프가 있습니다.

그래서 루프가 5 회 실행되면 모델은 5 개의 네트워크 요청을 보냅니다.

NSURLConnection의 sendAsyncRequest를 사용 중이며 완료 핸들러가 추가로 5 개의 스레드에서 호출된다는 사실을 고려하여 5 개의 스레드가 내 모델에서 작성되었다는 내용이 정확합니까?

자, 내 다른 컨트롤러에서이 루프를 다른 스레드 및 루프 반복마다 실행하도록 요청하면 모델 호출이 이전 반복에 종속적이어야하며 "Inception" 여기에 스레드가 있습니까? 기본적으로

, 나는 (완전히함으로써 내가 하위 스레드의 모든 너무 실행을 완료해야 의미한다.) 이전 스레드가 완전히 완료 한 경우에만 내 서버에 대한 후속 비동기 요청을 할

심지어 프레임을 할 수 없습니다 내가 혼자 힘으로 혼란 스럽기 때문에 문제는 적절하게. 하지만 아무도 도움을 줄 수 없다면 도움이 될 것입니다.

답변

9

일반적으로 5 개의 스레드가 생성되었다는 내용은 올바르지 않습니다.

스레드와 블록 사이에 일대일 매핑이 없습니다. GCD는 스레드 풀링을 구현 한 것입니다.

해당 장치의 최적 설정에 따라 특정 수의 스레드가 생성됩니다. 해당 운영 체제 릴리스에서 스레드를 생성하고 유지하는 데 드는 비용, 사용 가능한 프로세서 코어 수, 이미 가지고있는 스레드 수 현재 차단되어 있으며 Apple에서 고려해야 할 다른 요소가 모두 관련 될 수 있습니다.

그런 다음 GCD가 해당 스레드를 통해 블록을 확산합니다. 또는 새로운 스레드를 생성 할 수 있습니다. 그러나 반드시 그런 것은 아닙니다.

그 대기열은 블록 간 순서를 설정하는 방법 일뿐입니다. 직렬 디스패치 대기열은 반드시 자체 스레드를 소유하지는 않습니다. 모든 동시 디스패치 대기열은 반드시 자신의 스레드를 소유하지는 않습니다. 그러나 임의의 큐 집합이 모든 스레드를 공유한다고 믿을만한 이유가 없습니다.

블록 용 스레드를 선택하는 정확한 방법은 OS 버전간에 변경되었습니다. 예 : iOS 4는 iOS 5+가 분명히 없었던 방식으로 스레드 생성에있어 매우 모범적이었습니다.

GCD은 상황에 가장 적합한 것을 시도합니다. 그것을 추측하려는 시간을 낭비하지 마십시오.

+2

이것은 매우 좋은 대답입니다 ... –

+0

그건 사실입니다 .. –

1

는 "기본적으로, 나는 (완전히함으로써 내가 하위 스레드의 모든 너무 실행을 완료해야 의미한다.) 이전 스레드가 완전히 완료 한 경우에만 내 서버에 대한 후속 비동기 요청을하려면"

가 만에 초점 혼동을 피하기 위해 위의 진술. 간단한 해결책은 대기열을 만드는 것입니다. 대기열에 5 개의 루프를 공급하십시오. 각 루프는 네트워크 요청을 동 기적으로 생성합니다 ( sendSynchronousRequest : 메서드는 NSURLConnection에서 사용 가능). 요청 완료 후 작업을 수행 한 후 다음 루프를 시작합니다. FIFO에 뒤따라 오는 대기열은 요청을이어서 실행합니다.

+0

글쎄요, 이건 다소 저의 문제를 해결하려고 노력했습니다. –

0

GCD : 작업을 받아 들일 수있는 간단한 큐로 생각하십시오. 작업은 코드 블록입니다. 대기열에 원하는만큼 많은 작업을 넣을 수 있습니다 (시스템 한도 허용). 큐에는 다른 맛이 있습니다. 동시 대 직렬. Main vs Global. 높은 우선 순위와 낮은 우선 순위. 대기열은 스레드가 아닙니다.

스레드 : 코드의 한 줄을 연속적으로 실행합니다. 동시에 여러 스레드가 코드에서 작동하도록 할 수 있습니다. 스레드는 대기열이 아닙니다.

두 엔티티를 분리하면 시작이 명확 해집니다.

GCD는 기본적으로 프로세스에서 스레드를 사용하여 작업을 수행합니다. 직렬 대기열에서 모든 것이 순차적으로 처리됩니다. 따라서 코드에서 동기화 메커니즘을 사용할 필요가 없기 때문에 직렬 큐의 특성상 동기화가 보장됩니다. 동시 대기열 인 경우 (즉, 2 개 이상의 작업이 동시에 처리되는 경우 코드의 중요 섹션이 동기화로 보호되는지 확인해야합니다.)

수행 할 작업을 대기시키는 방법입니다.

dispatch_async(_yourDispatchQueue, ^() { 
    NSLog (@"work queued"); 
}); 

위의 NSLog는 백그라운드 스레드에서 가까운 미래의 시간에 백그라운드 스레드에서 실행됩니다.

우리가 dispatch_async를 요청할 때 알아 차리는 경우. 다른 변형은 dispatch_sync입니다. 2 사이의 차이점은 요청을 대기열에 넣은 후 비동기 변형이 계속 이동한다는 것입니다. 동기화 변이는 !!

NSURLConnection에 GCD를 사용하려면 연결을 시작할 스레드를주의해야합니다. 여기에 더 많은 정보를위한 SO 링크가 있습니다. GCD with NSURLConnection