2013-07-17 13 views

Odpowiedz

34

Utwórz kolejkę szeregową, a następnie użyj jej dispatch_set_target_queue(), aby ustawić kolejkę docelową na kolejkę o wysokim priorytecie.

Oto jak:

dispatch_set_target_queue(myQueue, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)); 

Teraz myQueue powinien pracować szeregowo z wysokim priorytecie. Oto another SO answer, jeśli chcesz dowiedzieć się więcej.

+0

ok świetnie, a to nadal oznacza, że ​​moja kolejka sama pozostanie seryjna, ale następnie opublikuje pracę w kolejce współbieżnej? –

+0

tak! Powinien zrobić to, co chciałeś. –

+0

dzięki bardzo pomocne! –

-2

Czy jest wymagana kolejka niestandardowa? Jeśli nie, można spojrzeć na dysponowanie blok do globalnej kolejki o wysokim priorytecie, które można pobrać za pomocą:

dispatch_queue_t q = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0) 

pamiętać, że jest to kolejka globalny więc może wpłynąć na inne operacje współbieżne.

+5

Wymagam, aby kolejka była serialna. –

2

Funkcja dispatch_queue_attr_make_with_qos_class mogą być nowe, ponieważ przyjął odpowiedź została wysłana, ale coś takiego:

dispatch_queue_attr_t priorityAttribute = dispatch_queue_attr_make_with_qos_class(
    DISPATCH_QUEUE_SERIAL, QOS_CLASS_USER_INITIATED, -1 
); 

myQueue = dispatch_queue_create("com.MyApp.MyQueue", priorityAttribute); 

mógłby przydzieli kolejce wysoki priorytet („jakość usług”). Istnieje wyższa klasa QOS, ale QOS_CLASS_USER_INITIATED jest odpowiednikiem DISPATCH_QUEUE_PRIORITY_HIGH.

+1

To powinno być teraz zaakceptowaną odpowiedzią. To jest właściwy sposób, aby to zrobić. – Rob

Powiązane problemy