내가

2016-07-21 2 views
0

내가이 동시에 압축 해제를 할 것입니다이내가

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ 
// unzip 5 files 

}) 
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ 
// unzip another 5 files 

}) 

내 의심의 여지처럼 파견 비동기를 사용하는의 문서 디렉토리에 10 파일의 압축을 풀 필요 하나 dispatch_async 다음 이상을 사용 무슨 경우?

처음 5 개 파일의 압축이 풀리는 동안 다른 5 개의 파일도 동시에 압축 해제 되니 ?

어떻게 효율적으로 할 수 있습니까?

도움이 될만한 것 같습니다.

+0

으로 그런데 요즘에는'DISPATCH_QUEUE_PRIORITY_HIGH'가 아닌 QOS_CLASS_UTILITY와 같은 Quality of Service 값을 사용합니다. – Rob

답변

0

전체 파일의 압축을 풀면 좋을 것입니다. 왜냐하면 비동기이기 때문입니다. 다른 백그라운드 프로세스를 시도하면 백그라운드 작업을 동시에 수행하는 동안 문제가 발생합니다. 큐에 파견

DISPATCH_QUEUE_PRIORITY_HIGH 항목 즉 큐는 임의의 기본 우선 순위 또는 낮은 우선 순위 큐 전에 실행을 위해 예약됩니다, 높은 우선 순위로 실행됩니다.

당신은 하나의 독립적 인 작업을 대기 실행하려는 당신이 다른 동시 작업하지 우려된다면 그것은 백그라운드 스레드에서 비동기 적으로 실행하는 글로벌 동시 큐

dispatch_queue_t globalConcurrentQueue = 
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) 

을 사용할 수 있습니다 . 이것은 데이터 파싱이 시간 소모적 인 작업이 될 수 있고 모든 애니메이션을 중지시키고 응용 프로그램이 응답하지 않는 주 스레드를 차단할 수 있기 때문에 수행됩니다.

Grand Central Dispatch

dispatch_async

Asynchronous Operations

Apple Document

UI and main Thread

GLobal Queue

01 글로벌 큐 동시 큐이기 때문에 23,516,

dispatch_sync and dispatch_async Process

0

, 두 번째 dispatch_async은 첫 번째와 동시에 발생합니다. 이렇게하면 다음을 확인해야합니다.

  • unzip 클래스/인스턴스는 스레드로부터 안전합니다.
  • 모든 모델 업데이트는 synchronized이어야합니다.
  • 동시 zip 작업으로 인한 최대 메모리 사용량이 너무 높지 않습니다.

위의 조건을 만족하지 않는 경우 (당신은 동시에, 연속적으로이 우편 작업을하지 실행하려는 경우 즉), 당신은 (dispatch_queue_create과) 압축을 해제하는 직렬 큐를 만들 수 있습니다. 이렇게하면 해당 대기열에 발송 된 압축 해제 작업은 백그라운드 대기열에서 연속적으로 수행되어 동시에 실행되지 않습니다.

0

dispatch_get_global_queue을 호출하면 OS에서 관리하는 백그라운드 대기열 (백그라운드 스레드에서 동시에 대기열 항목 이상으로 실행할 수있는 대기열)이 반환됩니다. 작업의 동시성은 실제로 장치가 가지고있는 코어의 수에 달려 있습니다.

dispatch_async에 전달하는 각 블록은 대기열 항목이므로 블록이 대기열에서 제외되고 실행될 때 블록 내부의 코드가 백그라운드 스레드에서 선형으로 실행됩니다. 예를 들어 당신은 같은 for 루프로 압축 해제됩니다

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ 
    for (int i = 0; i<5; i++) { 
     // Unzip here 
    } 

}) 

그런 다음 시간을 실행하는 작업이 5 × 파일의 압축을 풀고 시간이 될 것입니다. 두 세트를 두 세트로 묶으면 잠재적으로 전체 압축 해제 시간이 절반으로 줄어들 수 있습니다.

당신이 최대 동시성 (수 있도록 시스템과 즉 많은 동시성)으로 압축을 푼 10 개 개의 파일을 원하는 경우에, 당신은 등의 global_queue 10 개 블록을 파견 더 나을 것 :

for (int i = 0; i<5; i++) { 

     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ 

     // Unzip here 
    }) 
}