关于GCD的一些总结

/**

1.GCD的队列:

   串行队列:让任务一个接着一个地执行(一个任务执行完毕之后,再执行下一个任务)

   并行队列:可以让多个任务同时执行(GCD开启多个线程同时执行任务)

       可以同时调度多个任务执行

        并发功能只有在异步(dispatch_async)函数下在有效

 

    主队列:

       主队列中的任务,只有在主线程空闲的时候才会被调度执行。如果主线程上又代码执行,主队列不会调度任务

 

 

 2.GCD2个用来执行任务的函数

   同步的方式执行任务:

       在当前线程中依次的执行任务

   异步的方式执行任务:

       开辟新开线程,在新线程中执行任务

       如果将异步任务添加到并发队列中,同时底层线程池有可用的线程资源,CPU就会调度线程执行异步任务

       如果没有,就会创建新的线程去执行任务。

 

 */


#import "ViewController.h"


@interfaceViewController ()


@end


@implementation ViewController


-(void) touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{


    [selfdemo07];

}



//同步任务+串行队列

//总结:

//同步任务:当前线程会去添加任务,添加完任务之后,当前线程要去执行任务,任务执行完毕之后才能继续往下执行打印aaaaa

//队列中的任务有序执行:


-(void) demo01{


    dispatch_queue_t queue = dispatch_queue_create("CZ",DISPATCH_QUEUE_SERIAL);

    

    dispatch_sync(queue, ^{


        NSLog(@"start1");

        [NSThreadsleepForTimeInterval:2.0f];

        NSLog(@"end1");

    });

    

    NSLog(@"aaaaa");

    dispatch_sync(queue, ^{

        NSLog(@"start2");

        [NSThreadsleepForTimeInterval:1.0f];

        NSLog(@"end2");

    });

    

    NSLog(@"bbbb");

    dispatch_sync(queue, ^{

        NSLog(@"start3");

        [NSThreadsleepForTimeInterval:0.5f];

        NSLog(@"end3");


    });

    

}


/*

 运行结果:

 2015-12-14 12:01:53.897 关于GCD的一些总结[2437:73550] start1

 2015-12-14 12:01:55.903 关于GCD的一些总结[2437:73550] end1

 2015-12-14 12:01:55.903 关于GCD的一些总结[2437:73550] aaaaa

 2015-12-14 12:01:55.903 关于GCD的一些总结[2437:73550] start2

 2015-12-14 12:01:56.907 关于GCD的一些总结[2437:73550] end2

 2015-12-14 12:01:56.907 关于GCD的一些总结[2437:73550] bbbb

 2015-12-14 12:01:56.907 关于GCD的一些总结[2437:73550] start3

 2015-12-14 12:01:57.412 关于GCD的一些总结[2437:73550] end3

 

 */


//异步任务+串行队列

//总结:

//异步任务:当前线程只去执行当前的代码,而让子线程去执行添加到队列中的任务。

//队列中的任务有序执行:当前线程将任务添加到了串行队列,当子线程去执行任务的时候,也只能一个一个的取出来执行

-(void) demo02{

    

    dispatch_queue_t queue = dispatch_queue_create("CZ",DISPATCH_QUEUE_SERIAL);

    

    dispatch_async(queue, ^{

        

        NSLog(@"start1");

        [NSThreadsleepForTimeInterval:2.0f];

        NSLog(@"end1");

    });

    

    NSLog(@"aaaaa");

    dispatch_async(queue, ^{

        NSLog(@"start2");

        [NSThreadsleepForTimeInterval:1.0f];

        NSLog(@"end2");

    });

    

    NSLog(@"bbbb");

    dispatch_async(queue, ^{

        NSLog(@"start3");

        [NSThreadsleepForTimeInterval:0.5f];

        NSLog(@"end3");

        

    });

    

}


/*

 运行结果:

 2015-12-14 12:02:29.504 关于GCD的一些总结[2452:74099] start1

 2015-12-14 12:02:29.504 关于GCD的一些总结[2452:74064] aaaaa

 2015-12-14 12:02:29.505 关于GCD的一些总结[2452:74064] bbbb

 2015-12-14 12:02:31.507 关于GCD的一些总结[2452:74099] end1

 2015-12-14 12:02:31.507 关于GCD的一些总结[2452:74099] start2

 2015-12-14 12:02:32.513 关于GCD的一些总结[2452:74099] end2

 2015-12-14 12:02:32.513 关于GCD的一些总结[2452:74099] start3

 2015-12-14 12:02:33.018 关于GCD的一些总结[2452:74099] end3


 */



//同步任务+并发队列

//总结:

//同步任务:当前线程会去添加任务,添加完任务之后,当前线程要去执行任务,任务执行完毕之后才能继续往下执行打印aaaaa

//队列中的任务有序执行:


-(void) demo03{

    

    dispatch_queue_t queue = dispatch_queue_create("CZ",DISPATCH_QUEUE_CONCURRENT);

    

    dispatch_sync(queue, ^{

        

        NSLog(@"start1");

        [NSThreadsleepForTimeInterval:2.0f];

        NSLog(@"end1");

    });

    

    NSLog(@"aaaaa");

    dispatch_sync(queue, ^{

        NSLog(@"start2");

        [NSThreadsleepForTimeInterval:1.0f];

        NSLog(@"end2");

    });

    

    NSLog(@"bbbb");

    dispatch_sync(queue, ^{

        NSLog(@"start3");

        [NSThreadsleepForTimeInterval:0.5f];

        NSLog(@"end3");

        

    });

    

}


/*

 运行结果:

 2015-12-14 12:04:33.057 关于GCD的一些总结[2476:75282] start1

 2015-12-14 12:04:35.062 关于GCD的一些总结[2476:75282] end1

 2015-12-14 12:04:35.063 关于GCD的一些总结[2476:75282] aaaaa

 2015-12-14 12:04:35.063 关于GCD的一些总结[2476:75282] start2

 2015-12-14 12:04:36.068 关于GCD的一些总结[2476:75282] end2

 2015-12-14 12:04:36.068 关于GCD的一些总结[2476:75282] bbbb

 2015-12-14 12:04:36.069 关于GCD的一些总结[2476:75282] start3

 2015-12-14 12:04:36.573 关于GCD的一些总结[2476:75282] end3

 

 */


//异步任务+并发队列

//总结:

//异步任务:当前线程只去执行当前的代码,而让子线程去执行添加到队列中的任务。

//无序:当前线程添加任务,因为是并发队列,系统会调度多个子线程去执行任务

-(void) demo04{

    

    dispatch_queue_t queue = dispatch_queue_create("CZ",DISPATCH_QUEUE_CONCURRENT);

    

    dispatch_async(queue, ^{

        

        NSLog(@"start1");

        [NSThreadsleepForTimeInterval:2.0f];

        NSLog(@"end1");

    });

    

    NSLog(@"aaaaa");

    dispatch_async(queue, ^{

        NSLog(@"start2");

        [NSThreadsleepForTimeInterval:1.0f];

        NSLog(@"end2");

    });

    

    NSLog(@"bbbb");

    dispatch_async(queue, ^{

        NSLog(@"start3");

        [NSThreadsleepForTimeInterval:0.5f];

        NSLog(@"end3");

        

    });

    

}

/*

    运行结果

 2015-12-14 12:05:23.009 关于GCD的一些总结[2492:75869] aaaaa

 2015-12-14 12:05:23.009 关于GCD的一些总结[2492:75901] start1

 2015-12-14 12:05:23.009 关于GCD的一些总结[2492:75869] bbbb

 2015-12-14 12:05:23.009 关于GCD的一些总结[2492:75902] start2

 2015-12-14 12:05:23.010 关于GCD的一些总结[2492:75900] start3

 2015-12-14 12:05:23.515 关于GCD的一些总结[2492:75900] end3

 2015-12-14 12:05:24.015 关于GCD的一些总结[2492:75902] end2

 2015-12-14 12:05:25.013 关于GCD的一些总结[2492:75901] end1

 

 */



//同步任务+主队列=死锁

//总结:当将任务添加到主队列后,主线程等待任务被执行完毕。

//在主队列中的任务等待主线程空闲的时候被调度。它们之间的相互等待造成了死锁

-(void) demo05{


    dispatch_sync(dispatch_get_main_queue(), ^{

        

        NSLog(@"start1");

        [NSThreadsleepForTimeInterval:2.0f];

        NSLog(@"end1");

    });

    

    NSLog(@"aaaaa");

    dispatch_sync(dispatch_get_main_queue(), ^{

        NSLog(@"start2");

        [NSThreadsleepForTimeInterval:1.0f];

        NSLog(@"end2");

    });

    

    NSLog(@"bbbb");

    dispatch_sync(dispatch_get_main_queue(), ^{

        NSLog(@"start3");

        [NSThreadsleepForTimeInterval:0.5f];

        NSLog(@"end3");

        

    });


    

}


//异步任务+主队列

//总结:主线程添加完第一个任务之后,会立刻添加后面的任务,

//在主队列中的任务在等待着主线程空闲,主线程空闲之后就去执行主队列中的任务


-(void) demo06{

    

    dispatch_async(dispatch_get_main_queue(), ^{

        

        NSLog(@"start1");

        [NSThreadsleepForTimeInterval:2.0f];

        NSLog(@"end1");

    });

    

    NSLog(@"aaaaa");

    dispatch_async(dispatch_get_main_queue(), ^{

        NSLog(@"start2");

        [NSThreadsleepForTimeInterval:1.0f];

        NSLog(@"end2");

    });

    

    NSLog(@"bbbb");

    dispatch_async(dispatch_get_main_queue(), ^{

        NSLog(@"start3");

        [NSThreadsleepForTimeInterval:0.5f];

        NSLog(@"end3");

        

    });

}


/*

 运行结果:

 2015-12-14 12:06:12.769 关于GCD的一些总结[2508:76537] aaaaa

 2015-12-14 12:06:12.770 关于GCD的一些总结[2508:76537] bbbb

 2015-12-14 12:06:12.770 关于GCD的一些总结[2508:76537] start1

 2015-12-14 12:06:14.771 关于GCD的一些总结[2508:76537] end1

 2015-12-14 12:06:14.772 关于GCD的一些总结[2508:76537] start2

 2015-12-14 12:06:15.773 关于GCD的一些总结[2508:76537] end2

 2015-12-14 12:06:15.773 关于GCD的一些总结[2508:76537] start3

 2015-12-14 12:06:16.274 关于GCD的一些总结[2508:76537] end3

 

 */



//死锁的解决方案:将同步任务+主队列放在子线程中

//总结:现在子线程负责添加任务,主线程空闲着,可以去执行主队列中的任务

-(void) demo07{

    

    dispatch_async(dispatch_get_global_queue(0,0), ^{

        

        dispatch_sync(dispatch_get_main_queue(), ^{

            

            NSLog(@"start1");

            [NSThreadsleepForTimeInterval:2.0f];

            NSLog(@"end1");

        });

        

        NSLog(@"aaaaa");

        dispatch_sync(dispatch_get_main_queue(), ^{

            NSLog(@"start2");

            [NSThreadsleepForTimeInterval:1.0f];

            NSLog(@"end2");

        });

        

        NSLog(@"bbbb");

        dispatch_sync(dispatch_get_main_queue(), ^{

            NSLog(@"start3");

            [NSThreadsleepForTimeInterval:0.5f];

            NSLog(@"end3");

            

        });

        

    });

    

}


/*

 2015-12-14 12:06:42.841 关于GCD的一些总结[2521:77234] start1

 2015-12-14 12:06:44.843 关于GCD的一些总结[2521:77234] end1

 2015-12-14 12:06:44.843 关于GCD的一些总结[2521:77266] aaaaa

 2015-12-14 12:06:44.844 关于GCD的一些总结[2521:77234] start2

 2015-12-14 12:06:45.845 关于GCD的一些总结[2521:77234] end2

 2015-12-14 12:06:45.845 关于GCD的一些总结[2521:77266] bbbb

 2015-12-14 12:06:45.846 关于GCD的一些总结[2521:77234] start3

 2015-12-14 12:06:46.347 关于GCD的一些总结[2521:77234] end3

 */





- (void)viewDidLoad {

    [superviewDidLoad];

    // Do any additional setup after loading the view, typically from a nib.

}


- (void)didReceiveMemoryWarning {

    [superdidReceiveMemoryWarning];

    // Dispose of any resources that can be recreated.

}


@end


/**

1.GCD的队列:

   串行队列:让任务一个接着一个地执行(一个任务执行完毕之后,再执行下一个任务)

   并行队列:可以让多个任务同时执行(GCD开启多个线程同时执行任务)

       可以同时调度多个任务执行

        并发功能只有在异步(dispatch_async)函数下在有效

 

    主队列:

       主队列中的任务,只有在主线程空闲的时候才会被调度执行。如果主线程上又代码执行,主队列不会调度任务

 

 

 2.GCD2个用来执行任务的函数

   同步的方式执行任务:

       在当前线程中依次的执行任务

   异步的方式执行任务:

       开辟新开线程,在新线程中执行任务

       如果将异步任务添加到并发队列中,同时底层线程池有可用的线程资源,CPU就会调度线程执行异步任务

       如果没有,就会创建新的线程去执行任务。

 

 */


#import "ViewController.h"


@interfaceViewController ()


@end


@implementation ViewController


-(void) touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{


    [selfdemo07];

}



//同步任务+串行队列

//总结:

//同步任务:当前线程会去添加任务,添加完任务之后,当前线程要去执行任务,任务执行完毕之后才能继续往下执行打印aaaaa

//队列中的任务有序执行:


-(void) demo01{


    dispatch_queue_t queue = dispatch_queue_create("CZ",DISPATCH_QUEUE_SERIAL);

    

    dispatch_sync(queue, ^{


        NSLog(@"start1");

        [NSThreadsleepForTimeInterval:2.0f];

        NSLog(@"end1");

    });

    

    NSLog(@"aaaaa");

    dispatch_sync(queue, ^{

        NSLog(@"start2");

        [NSThreadsleepForTimeInterval:1.0f];

        NSLog(@"end2");

    });

    

    NSLog(@"bbbb");

    dispatch_sync(queue, ^{

        NSLog(@"start3");

        [NSThreadsleepForTimeInterval:0.5f];

        NSLog(@"end3");


    });

    

}


/*

 运行结果:

 2015-12-14 12:01:53.897 关于GCD的一些总结[2437:73550] start1

 2015-12-14 12:01:55.903 关于GCD的一些总结[2437:73550] end1

 2015-12-14 12:01:55.903 关于GCD的一些总结[2437:73550] aaaaa

 2015-12-14 12:01:55.903 关于GCD的一些总结[2437:73550] start2

 2015-12-14 12:01:56.907 关于GCD的一些总结[2437:73550] end2

 2015-12-14 12:01:56.907 关于GCD的一些总结[2437:73550] bbbb

 2015-12-14 12:01:56.907 关于GCD的一些总结[2437:73550] start3

 2015-12-14 12:01:57.412 关于GCD的一些总结[2437:73550] end3

 

 */


//异步任务+串行队列

//总结:

//异步任务:当前线程只去执行当前的代码,而让子线程去执行添加到队列中的任务。

//队列中的任务有序执行:当前线程将任务添加到了串行队列,当子线程去执行任务的时候,也只能一个一个的取出来执行

-(void) demo02{

    

    dispatch_queue_t queue = dispatch_queue_create("CZ",DISPATCH_QUEUE_SERIAL);

    

    dispatch_async(queue, ^{

        

        NSLog(@"start1");

        [NSThreadsleepForTimeInterval:2.0f];

        NSLog(@"end1");

    });

    

    NSLog(@"aaaaa");

    dispatch_async(queue, ^{

        NSLog(@"start2");

        [NSThreadsleepForTimeInterval:1.0f];

        NSLog(@"end2");

    });

    

    NSLog(@"bbbb");

    dispatch_async(queue, ^{

        NSLog(@"start3");

        [NSThreadsleepForTimeInterval:0.5f];

        NSLog(@"end3");

        

    });

    

}


/*

 运行结果:

 2015-12-14 12:02:29.504 关于GCD的一些总结[2452:74099] start1

 2015-12-14 12:02:29.504 关于GCD的一些总结[2452:74064] aaaaa

 2015-12-14 12:02:29.505 关于GCD的一些总结[2452:74064] bbbb

 2015-12-14 12:02:31.507 关于GCD的一些总结[2452:74099] end1

 2015-12-14 12:02:31.507 关于GCD的一些总结[2452:74099] start2

 2015-12-14 12:02:32.513 关于GCD的一些总结[2452:74099] end2

 2015-12-14 12:02:32.513 关于GCD的一些总结[2452:74099] start3

 2015-12-14 12:02:33.018 关于GCD的一些总结[2452:74099] end3


 */



//同步任务+并发队列

//总结:

//同步任务:当前线程会去添加任务,添加完任务之后,当前线程要去执行任务,任务执行完毕之后才能继续往下执行打印aaaaa

//队列中的任务有序执行:


-(void) demo03{

    

    dispatch_queue_t queue = dispatch_queue_create("CZ",DISPATCH_QUEUE_CONCURRENT);

    

    dispatch_sync(queue, ^{

        

        NSLog(@"start1");

        [NSThreadsleepForTimeInterval:2.0f];

        NSLog(@"end1");

    });

    

    NSLog(@"aaaaa");

    dispatch_sync(queue, ^{

        NSLog(@"start2");

        [NSThreadsleepForTimeInterval:1.0f];

        NSLog(@"end2");

    });

    

    NSLog(@"bbbb");

    dispatch_sync(queue, ^{

        NSLog(@"start3");

        [NSThreadsleepForTimeInterval:0.5f];

        NSLog(@"end3");

        

    });

    

}


/*

 运行结果:

 2015-12-14 12:04:33.057 关于GCD的一些总结[2476:75282] start1

 2015-12-14 12:04:35.062 关于GCD的一些总结[2476:75282] end1

 2015-12-14 12:04:35.063 关于GCD的一些总结[2476:75282] aaaaa

 2015-12-14 12:04:35.063 关于GCD的一些总结[2476:75282] start2

 2015-12-14 12:04:36.068 关于GCD的一些总结[2476:75282] end2

 2015-12-14 12:04:36.068 关于GCD的一些总结[2476:75282] bbbb

 2015-12-14 12:04:36.069 关于GCD的一些总结[2476:75282] start3

 2015-12-14 12:04:36.573 关于GCD的一些总结[2476:75282] end3

 

 */


//异步任务+并发队列

//总结:

//异步任务:当前线程只去执行当前的代码,而让子线程去执行添加到队列中的任务。

//无序:当前线程添加任务,因为是并发队列,系统会调度多个子线程去执行任务

-(void) demo04{

    

    dispatch_queue_t queue = dispatch_queue_create("CZ",DISPATCH_QUEUE_CONCURRENT);

    

    dispatch_async(queue, ^{

        

        NSLog(@"start1");

        [NSThreadsleepForTimeInterval:2.0f];

        NSLog(@"end1");

    });

    

    NSLog(@"aaaaa");

    dispatch_async(queue, ^{

        NSLog(@"start2");

        [NSThreadsleepForTimeInterval:1.0f];

        NSLog(@"end2");

    });

    

    NSLog(@"bbbb");

    dispatch_async(queue, ^{

        NSLog(@"start3");

        [NSThreadsleepForTimeInterval:0.5f];

        NSLog(@"end3");

        

    });

    

}

/*

    运行结果

 2015-12-14 12:05:23.009 关于GCD的一些总结[2492:75869] aaaaa

 2015-12-14 12:05:23.009 关于GCD的一些总结[2492:75901] start1

 2015-12-14 12:05:23.009 关于GCD的一些总结[2492:75869] bbbb

 2015-12-14 12:05:23.009 关于GCD的一些总结[2492:75902] start2

 2015-12-14 12:05:23.010 关于GCD的一些总结[2492:75900] start3

 2015-12-14 12:05:23.515 关于GCD的一些总结[2492:75900] end3

 2015-12-14 12:05:24.015 关于GCD的一些总结[2492:75902] end2

 2015-12-14 12:05:25.013 关于GCD的一些总结[2492:75901] end1

 

 */



//同步任务+主队列=死锁

//总结:当将任务添加到主队列后,主线程等待任务被执行完毕。

//在主队列中的任务等待主线程空闲的时候被调度。它们之间的相互等待造成了死锁

-(void) demo05{


    dispatch_sync(dispatch_get_main_queue(), ^{

        

        NSLog(@"start1");

        [NSThreadsleepForTimeInterval:2.0f];

        NSLog(@"end1");

    });

    

    NSLog(@"aaaaa");

    dispatch_sync(dispatch_get_main_queue(), ^{

        NSLog(@"start2");

        [NSThreadsleepForTimeInterval:1.0f];

        NSLog(@"end2");

    });

    

    NSLog(@"bbbb");

    dispatch_sync(dispatch_get_main_queue(), ^{

        NSLog(@"start3");

        [NSThreadsleepForTimeInterval:0.5f];

        NSLog(@"end3");

        

    });


    

}


//异步任务+主队列

//总结:主线程添加完第一个任务之后,会立刻添加后面的任务,

//在主队列中的任务在等待着主线程空闲,主线程空闲之后就去执行主队列中的任务


-(void) demo06{

    

    dispatch_async(dispatch_get_main_queue(), ^{

        

        NSLog(@"start1");

        [NSThreadsleepForTimeInterval:2.0f];

        NSLog(@"end1");

    });

    

    NSLog(@"aaaaa");

    dispatch_async(dispatch_get_main_queue(), ^{

        NSLog(@"start2");

        [NSThreadsleepForTimeInterval:1.0f];

        NSLog(@"end2");

    });

    

    NSLog(@"bbbb");

    dispatch_async(dispatch_get_main_queue(), ^{

        NSLog(@"start3");

        [NSThreadsleepForTimeInterval:0.5f];

        NSLog(@"end3");

        

    });

}


/*

 运行结果:

 2015-12-14 12:06:12.769 关于GCD的一些总结[2508:76537] aaaaa

 2015-12-14 12:06:12.770 关于GCD的一些总结[2508:76537] bbbb

 2015-12-14 12:06:12.770 关于GCD的一些总结[2508:76537] start1

 2015-12-14 12:06:14.771 关于GCD的一些总结[2508:76537] end1

 2015-12-14 12:06:14.772 关于GCD的一些总结[2508:76537] start2

 2015-12-14 12:06:15.773 关于GCD的一些总结[2508:76537] end2

 2015-12-14 12:06:15.773 关于GCD的一些总结[2508:76537] start3

 2015-12-14 12:06:16.274 关于GCD的一些总结[2508:76537] end3

 

 */



//死锁的解决方案:将同步任务+主队列放在子线程中

//总结:现在子线程负责添加任务,主线程空闲着,可以去执行主队列中的任务

-(void) demo07{

    

    dispatch_async(dispatch_get_global_queue(0,0), ^{

        

        dispatch_sync(dispatch_get_main_queue(), ^{

            

            NSLog(@"start1");

            [NSThreadsleepForTimeInterval:2.0f];

            NSLog(@"end1");

        });

        

        NSLog(@"aaaaa");

        dispatch_sync(dispatch_get_main_queue(), ^{

            NSLog(@"start2");

            [NSThreadsleepForTimeInterval:1.0f];

            NSLog(@"end2");

        });

        

        NSLog(@"bbbb");

        dispatch_sync(dispatch_get_main_queue(), ^{

            NSLog(@"start3");

            [NSThreadsleepForTimeInterval:0.5f];

            NSLog(@"end3");

            

        });

        

    });

    

}


/*

 2015-12-14 12:06:42.841 关于GCD的一些总结[2521:77234] start1

 2015-12-14 12:06:44.843 关于GCD的一些总结[2521:77234] end1

 2015-12-14 12:06:44.843 关于GCD的一些总结[2521:77266] aaaaa

 2015-12-14 12:06:44.844 关于GCD的一些总结[2521:77234] start2

 2015-12-14 12:06:45.845 关于GCD的一些总结[2521:77234] end2

 2015-12-14 12:06:45.845 关于GCD的一些总结[2521:77266] bbbb

 2015-12-14 12:06:45.846 关于GCD的一些总结[2521:77234] start3

 2015-12-14 12:06:46.347 关于GCD的一些总结[2521:77234] end3

 */





- (void)viewDidLoad {

    [superviewDidLoad];

    // Do any additional setup after loading the view, typically from a nib.

}


- (void)didReceiveMemoryWarning {

    [superdidReceiveMemoryWarning];

    // Dispose of any resources that can be recreated.

}


@end

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值