zoukankan      html  css  js  c++  java
  • [IOS笔记]

    block: block是c的一个运行时特性,和函数指针类似,用户回调函数。主要用于并行线程。

    //创建一个分发队列,第一个参数为队列名,第二个参数是保留的 dispatch_queue 属性,设为null
    //可使用函数 dispatch_queue_t dispatch_get_global_queue(long priority, unsigned long flags);来获得全局的 dispatch_queue,参数 priority 表示优先级,
    dispatch_queue_t queue = dispatch_queue_create("test_queue", NULL);
    //dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
    //将一个 block 加入一个 dispatch_queue,这个 block 会再其后得到调度时,并行运行。一个queue可以加入多个block,这些 blocks 是按照 FIFO(先入先出)规则调度的,先加入的先执行,后加入的一定后执行,但在某一个时刻,可能有多个 block 同时在执行。实际结果是第一个执行完执行第二个。
    dispatch_sync(queue, ^(void){
            for (int i=0; i<100; ++i) {
                NSLog(@"i:%d", i);
            }
    });

    信号:sem

    //创建信号,将其资源初始值设置为 0 (不能少于 0),表示任务还没有完成,没有资源可用主线程不要做事情。
        __block dispatch_semaphore_t sem = dispatch_semaphore_create(0);
        __block dispatch_semaphore_t sem2 = dispatch_semaphore_create(0);
        
        dispatch_queue_t queue = dispatch_queue_create("test_queue", NULL);
        dispatch_sync(queue, ^(void){
            for (int i=0; i<100; ++i) {
                NSLog(@" block 1 i:%d", i);
            }
            //增加 semaphore 计数(可理解为资源数),表明任务完成,有资源可用主线程可以做事情了。
            dispatch_semaphore_signal(sem);
        });
        dispatch_sync(queue, ^(void){
            dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
            for (int i=0; i<100; ++i) {
                NSLog(@" block 2 i:%d", i);
            }
            dispatch_semaphore_signal(sem2);
        });
        
        //等待信号,主线程继续运行,减少 semaphore 的计数,如果资源数少于 0,则表明资源还可不得,我得按照FIFO(先等先得)的规则等待资源就绪,一旦资源就绪并且得到调度了,我再执行。
        dispatch_semaphore_wait(sem2, DISPATCH_TIME_FOREVER);
        dispatch_release(queue);
        dispatch_release(sem);

    group

    将block加入到group,group中所有block执行完之后,主线程才可以继续运行

    //创建信号,将其资源初始值设置为 0 (不能少于 0),表示任务还没有完成,没有资源可用主线程不要做事情。
        __block dispatch_semaphore_t sem = dispatch_semaphore_create(0);
        
        dispatch_queue_t queue = dispatch_queue_create("test_queue", NULL);
        dispatch_group_t group = dispatch_group_create();
        dispatch_group_async(group, queue, ^(void){
            for (int i=0; i<100; ++i) {
                NSLog(@" block 1 i:%d", i);
            }
            //增加 semaphore 计数(可理解为资源数),表明任务完成,有资源可用主线程可以做事情了。
            dispatch_semaphore_signal(sem);
        });
        
        dispatch_block_t block2 = ^(void){
            dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
            for (int i=0; i<100; ++i) {
                NSLog(@" block 2 i:%d", i);
            }
        };
        dispatch_group_async(group, queue, block2);
        
        //主线程等待block执行完成
        dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
        
        dispatch_release(group);
        dispatch_release(queue);
        dispatch_release(sem);

    子线程运行完

    dispatch_async(getDataQueue,^{
        //获取数据,获得一组后,刷新UI.
        dispatch_aysnc (mainQueue, ^{
        //UI的更新需在主线程中进行
    };
    }
    )
  • 相关阅读:
    中介者模式
    观察者模式
    javascript深入理解js闭包
    外观模式
    模板方法模式
    浅析C#深拷贝与浅拷贝
    C#浅拷贝与深拷贝区别
    6个重要的.NET概念:栈,堆,值类型,引用类型,装箱,拆箱
    原型模式
    设计模式总结
  • 原文地址:https://www.cnblogs.com/zengyou/p/3325998.html
Copyright © 2011-2022 走看看