gcd常见用法

Posted wobushimashen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了gcd常见用法相关的知识,希望对你有一定的参考价值。

gcd常见用法


- (IBAction)aaaa:(id)sender {

//    [self gcdBlockCancel];
//    CFRunLoopGetCurrent();


//    for (int i = 0; i < 3; i++) {
//        [self gcdCancel];
//    }
//    [self queueDrop];

//    [self sourceDemo];

//    NSOperation *op;


//    [self testSemaphore];


    //[self testBarrier];

    [self sourceDemo];

//    [self timerDemo];


    //消息转发

}


- (void)timerDemo {
    //gcd timer
}

- (void)testBarrier {

    __block dispatch_queue_t queue = dispatch_queue_create("hello", 0);
    dispatch_async(queue, ^{
        NSLog(@"hello 111");
    });

    dispatch_async(queue, ^{
        [NSThread sleepForTimeInterval:2];
        NSLog(@"hello 22222");

    });

    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        [NSThread sleepForTimeInterval:1];
        NSLog(@"在全局队列操作");
        //dispatch_suspend(queue);
        //queue = NULL;
    });

    dispatch_async(queue, ^{
        NSLog(@"准备挂起");
        dispatch_suspend(queue);
        NSLog(@"挂起了....");
        //queue = NULL;
    });


    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        [NSThread sleepForTimeInterval:5];
        NSLog(@"取消挂起,恢复队列..");
        dispatch_resume(queue);
    });


    dispatch_barrier_sync(queue, ^{
        NSLog(@"该轮到我了....");
    });

}

- (void)testSemaphore {

    dispatch_semaphore_t semaphore = dispatch_semaphore_create(2);
    dispatch_queue_t queue = dispatch_queue_create("hello", 0);
    dispatch_async(queue, ^{
        for (int i = 0; i < 10; i++) {
            dispatch_async(dispatch_get_global_queue(0, 0), ^{
                dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
                NSLog(@"i====%d",i);
                sleep(1);
                dispatch_semaphore_signal(semaphore);
            });
        }
    });    
}

- (void)testGroup {
    //group
    dispatch_group_t group = dispatch_group_create();
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(2);
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    for (int i = 0; i < 10; i++)
    {
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
        dispatch_group_async(group, queue, ^{
            NSLog(@"%i",i);
            sleep(1);
            dispatch_semaphore_signal(semaphore);
        });
    }
    dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
    dispatch_group_notify(group, queue, ^{
        NSLog(@"finished...");
    });

}


- (void)sourceDemo {
    dispatch_queue_t queue = dispatch_queue_create("com.example.gcd.MyConcurrentDispatchQueue", DISPATCH_QUEUE_CONCURRENT);


//    dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
//    dispatch_source_set_timer(timer, DISPATCH_TIME_NOW, 5 * NSEC_PER_SEC, 1 * NSEC_PER_SEC);
//    dispatch_source_set_event_handler(timer, ^{
//        NSLog(@"aaa");
//    });
//    dispatch_resume(timer);


//    dispatch_source_t source = dispatch_source_create(DISPATCH_SOURCE_TYPE_READ,
//                                                      0, 0, queue);
//
//
//    dispatch_block_t block1 = dispatch_block_create(0, ^{
////        sleep(5);
//        NSLog(@"block1 %@",[NSThread currentThread]);
//
//    });
//
//
//    dispatch_source_set_event_handler(source, block1);
//
//    dispatch_source_set_event_handler(source, ^{
//        // Get some data from the source variable, which is captured
//        // from the parent context.
//        size_t estimated = dispatch_source_get_data(source);
//        // Continue reading the descriptor...
//        NSLog(@"aaa");
//    });
//    dispatch_resume(source);


    dispatch_source_t source = dispatch_source_create(DISPATCH_SOURCE_TYPE_DATA_ADD, 0, 0, queue);

    dispatch_async(queue, ^{

        __block BOOL shouldStop = NO;
        dispatch_source_set_event_handler(source, ^{
            size_t estimated = dispatch_source_get_data(source);
            // Continue reading the descriptor...
            NSLog(@"estimated===%ld",estimated);
            if (estimated == 2) {
                NSLog(@"收到source......");
                shouldStop = YES;
            }
            NSLog(@"马上停止队列...");
            //dispatch_source_cancel(source);
            dispatch_suspend(queue);
        });
        dispatch_resume(source);
        for (NSInteger i = 0; i < 99; i++) {

            [NSThread sleepForTimeInterval:0.5];
            if (shouldStop) {
                NSLog(@"任务取消了...");

                dispatch_sync(dispatch_get_main_queue(), ^{
                    //更新UI
                    NSLog(@"更新UI....");
                });
                break;
            }
            NSLog(@"index====%ld",i);
        }
    });


    dispatch_async(dispatch_get_global_queue(0, 0), ^{

        //网络请求
        [NSThread sleepForTimeInterval:5];
        dispatch_source_merge_data(source, 2); //通知队列
    });



}

- (void)queueDrop {

    dispatch_queue_t myConcurrentDispatchQueue = dispatch_queue_create("com.example.gcd.MyConcurrentDispatchQueue", DISPATCH_QUEUE_CONCURRENT);
    dispatch_async(myConcurrentDispatchQueue, ^{

        NSLog(@"block on myConcurrentDispatchQueue");

    });
    //dispatch_release(myConcurrentDispatchQueue);

}

- (void)gcdBlockCancel{

    dispatch_queue_t queue = dispatch_queue_create("com.gcdtest.www", DISPATCH_QUEUE_CONCURRENT);

    dispatch_block_t block1 = dispatch_block_create(0, ^{
        sleep(5);
        NSLog(@"block1 %@",[NSThread currentThread]);

    });

    dispatch_block_t block2 = dispatch_block_create(0, ^{
        NSLog(@"block2 %@",[NSThread currentThread]);
    });

    dispatch_block_t block3 = dispatch_block_create(0, ^{
        NSLog(@"block3 %@",[NSThread currentThread]);
    });

    dispatch_async(queue, block1);
    dispatch_async(queue, block2);
    dispatch_block_cancel(block3);
}
- (void)gcdCancel{

    dispatch_queue_t queue = dispatch_queue_create("demo.test", 0);//dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    __block BOOL isCancel = NO;

    dispatch_async(queue, ^{
        NSLog(@"任务001 %@",[NSThread currentThread]);
    });

    dispatch_async(queue, ^{
        NSLog(@"任务002 %@",[NSThread currentThread]);
    });

    dispatch_async(queue, ^{
        NSLog(@"任务003 %@",[NSThread currentThread]);
        isCancel = YES;
    });

    dispatch_async(queue, ^{
        // 模拟:线程等待3秒,确保任务003完成 isCancel=YES
        sleep(3);
        if(isCancel){
            NSLog(@"任务004已被取消 %@",[NSThread currentThread]);
        }else{
            NSLog(@"任务004 %@",[NSThread currentThread]);
        }
    });
}

以上是关于gcd常见用法的主要内容,如果未能解决你的问题,请参考以下文章

ios多线程 -- GCD 常见用法

GCD的常见用法

iOS开发多线程篇 — GCD的常见用法

使用 Git 来管理 Xcode 中的代码片段

代码笔记iOS-GCD用法

读书笔记iOS-GCD-用法