隊列queue.h方法總覽


queue.h
Queue相關(guān)其他方法
一、迭代執(zhí)行任務(wù)
/**
dispatch_apply函數(shù)是dispatch_sync函數(shù)和Dispatch Group的關(guān)聯(lián)API
該函數(shù)按指定的次數(shù)將指定的Block追加到指定的Dispatch Queue中,并等到全部的處理執(zhí)行結(jié)束
@param iterations 指定重復(fù)次數(shù)
@param queue 追加對象的Dispatch Queue
@param index 帶有參數(shù)的Block, index的作用是為了按執(zhí)行的順序區(qū)分各個Block
*/
void
dispatch_apply(size_t iterations, dispatch_queue_t queue,
DISPATCH_NOESCAPE void (^block)(size_t));
void
dispatch_apply_f(size_t iterations, dispatch_queue_t queue,
void *_Nullable context,
void (*work)(void *_Nullable, size_t));
舉例說明:
//任務(wù)都是同步執(zhí)行,會阻塞主線程(dispatch_apply是同步方法)
dispatch_queue_attr_t attr = dispatch_queue_attr_make_with_qos_class(DISPATCH_QUEUE_SERIAL, QOS_CLASS_USER_INITIATED, -1);
dispatch_queue_t queue = dispatch_queue_create("com.Maker", attr);
dispatch_apply(3, queue, ^(size_t index) {
for (int i = 0; i < 5; i++) {
if (index == 0) {
NSLog(@"任務(wù)內(nèi)部順序----%d 任務(wù)順序====%zu", i,index);
}
else if (index == 1) {
NSLog(@"任務(wù)內(nèi)部順序----%d 任務(wù)順序~~~~%zu", i,index);
}
else if (index == 2) {
NSLog(@"任務(wù)內(nèi)部順序----%d 任務(wù)順序____%zu", i,index);
}
else {
NSLog(@"任務(wù)內(nèi)部順序----%d 任務(wù)順序++++%zu", i,index);
}
}
});
二、延遲執(zhí)行
/**
延遲執(zhí)行任務(wù)
@param when 延遲執(zhí)行的時間
@param queue 指定在某一隊列中延遲執(zhí)行
@param block 執(zhí)行的具體任務(wù)
*/
void
dispatch_after(dispatch_time_t when,
dispatch_queue_t queue,
dispatch_block_t block);
/**
延遲執(zhí)行任務(wù)
@param when 延遲執(zhí)行的時間
@param queue 指定在某一隊列中延遲執(zhí)行
@param context 傳遞給work的任意類型(void *)參數(shù)
@param work 執(zhí)行的C語言函數(shù)名(函數(shù)指針)
*/
void
dispatch_after_f(dispatch_time_t when,
dispatch_queue_t queue,
void *_Nullable context,
dispatch_function_t work);
舉例說明:
//這個任務(wù)將會在10秒后執(zhí)行
/*----dispatch_after----*/
int delayInSeconds = 10;
dispatch_time_t delaytime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(delaytime, dispatch_get_main_queue(), ^{
//任務(wù)
});
/*----dispatch_after_f----*/
int context = 10;
int delayInSeconds = 10;
dispatch_time_t delaytime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after_f(delaytime, dispatch_get_main_queue(), &context, logCount);
void logCount(void* context) {
int *c = context;
NSLog(@"內(nèi)存地址 === %p 值 === %d", &c,*c);
}
三、設(shè)置隊列屬性
/**
隊列屬性(串行/并發(fā)、優(yōu)先級等)
@param attr 隊列屬性(DISPATCH_QUEUE_SERIAL / DISPATCH_QUEUE_CONCURRENT)
*/
dispatch_queue_attr_t
dispatch_queue_attr_make_initially_inactive(
dispatch_queue_attr_t _Nullable attr);
/**
隊列屬性(串行/并發(fā)、優(yōu)先級等)
@param attr 隊列屬性(DISPATCH_QUEUE_SERIAL / DISPATCH_QUEUE_CONCURRENT)
@param frequency
*/
dispatch_queue_attr_t
dispatch_queue_attr_make_with_autorelease_frequency(
dispatch_queue_attr_t _Nullable attr,
dispatch_autorelease_frequency_t frequency);
/**
隊列屬性(串行/并發(fā)、優(yōu)先級等)
@param attr 隊列屬性(DISPATCH_QUEUE_SERIAL / DISPATCH_QUEUE_CONCURRENT)
@param qos_class
@param relative_priority
*/
dispatch_queue_attr_t
dispatch_queue_attr_make_with_qos_class(dispatch_queue_attr_t _Nullable attr,
dispatch_qos_class_t qos_class, int relative_priority);
三、其他相關(guān)方法(不常用)
const char *
dispatch_queue_get_label(dispatch_queue_t _Nullable queue);
dispatch_qos_class_t
dispatch_queue_get_qos_class(dispatch_queue_t queue,
int *_Nullable relative_priority_ptr);
void
dispatch_set_target_queue(dispatch_object_t object,
dispatch_queue_t _Nullable queue);
void
dispatch_main(void);
void
dispatch_queue_set_specific(dispatch_queue_t queue, const void *key,
void *_Nullable context, dispatch_function_t _Nullable destructor);
void *_Nullable
dispatch_queue_get_specific(dispatch_queue_t queue, const void *key);
void *_Nullable
dispatch_get_specific(const void *key);
void
dispatch_assert_queue_barrier(dispatch_queue_t queue);