dispatch_suspendとdispatch_resume

1573 ワード

dispatch_suspendはキューを一時停止するために使用され、dispatch_resumeはキューを復元するために使用されるが、この2つの方法の参照から、タイマまたは他のdispatch_object_tはすべて可能です.キューが一時停止すると、すでに実行されているタスクは停止できませんが、開始されていないタスクはresumeを待ってから実行されます.しかし、テストの結果、システムが提供するdispatch_get_global_Queueが取得したパラレルキューは、保留およびリカバリの影響を受けません.
- (void)func08
{
    dispatch_queue_t queue = dispatch_queue_create("MYQUEUE", DISPATCH_QUEUE_SERIAL);
//    dispatch_queue_t queue = dispatch_queue_create("MYQUEUE", DISPATCH_QUEUE_CONCURRENT);
//    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_async(queue, ^{
        for (NSInteger i = 0; i < 10; i++) {
            NSLog(@"0: == %@", [NSThread currentThread]);
            [NSThread sleepForTimeInterval:1];
        }
    });
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(4 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        NSLog(@" ");
        dispatch_suspend(queue);
    });
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        NSLog(@" ");
        dispatch_async(queue, ^{
            for (NSInteger i = 0; i < 10; i++) {
                NSLog(@"1: == %@", [NSThread currentThread]);
                [NSThread sleepForTimeInterval:1];
            }
        });
        NSLog(@" ");
    });
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(12 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        NSLog(@" ");
        dispatch_resume(queue);
    });
}