`
linwwwei
  • 浏览: 222713 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

dispatch_queue_t初学(转载)

 
阅读更多
1. GCD 使用后不用程序去管理线程的开闭,GCD会在系统层面上去动态检测系统状态,开闭线程
2. Dispatch Queues   单行 并行 2种  FIFO  把task依次放入单行queue可以实现顺序执行
3. Operation Queues 可以指定任务之间的优先级  task之间的先后依赖关系
4. __block变量是可以改变的 共享的

    dispatch_queue_t aQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);

    for (__block int i = 0; i<10000; i++) {
        dispatch_async(aQueue, ^{
            NSLog(@"%d",i);
        });
    }

2011-07-05 17:11:38.346 ttt[41418:1803] 61
2011-07-05 17:11:38.346 ttt[41418:5f03] 1292
2011-07-05 17:11:38.348 ttt[41418:1803] 4096
2011-07-05 17:11:38.348 ttt[41418:5f03] 4954
2011-07-05 17:11:38.349 ttt[41418:1803] 5823
2011-07-05 17:11:38.349 ttt[41418:5f03] 6159
2011-07-05 17:11:38.349 ttt[41418:1803] 6575
2011-07-05 17:11:38.349 ttt[41418:5f03] 6634
2011-07-05 17:11:38.350 ttt[41418:1803] 7936
2011-07-05 17:11:38.350 ttt[41418:5f03] 8428
2011-07-05 17:11:38.351 ttt[41418:1803] 8895
2011-07-05 17:11:38.351 ttt[41418:5f03] 9364
2011-07-05 17:11:38.351 ttt[41418:1803] 9836
2011-07-05 17:11:38.351 ttt[41418:5f03] 10000
2011-07-05 17:11:38.354 ttt[41418:1803] 10000

5. 一般外部变量是copy正在运行时的外部状态

    dispatch_queue_t aQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);

    for (int i = 0; i<1000; i++) {
        dispatch_async(aQueue, ^{
            NSLog(@"%d",i);
        });
    }

2011-07-05 17:15:37.525 ttt[41697:1803] 0
2011-07-05 17:15:37.526 ttt[41697:1803] 2
2011-07-05 17:15:37.527 ttt[41697:1803] 3
2011-07-05 17:15:37.527 ttt[41697:1803] 4
2011-07-05 17:15:37.527 ttt[41697:1803] 5
2011-07-05 17:15:37.527 ttt[41697:1803] 6
2011-07-05 17:15:37.526 ttt[41697:5f03] 1
2011-07-05 17:15:37.530 ttt[41697:5f03] 8
2011-07-05 17:15:37.530 ttt[41697:5f03] 9
2011-07-05 17:15:37.530 ttt[41697:5f03] 10
2011-07-05 17:15:37.530 ttt[41697:5f03] 11
2011-07-05 17:15:37.532 ttt[41697:6203] 13


6. queue可以有结束时执行的方法

void myFinalizerFunction(){
    NSLog(@"xxx");
}

- (void)viewDidLoad {
    [superviewDidLoad];
   
   
    dispatch_queue_t queue = dispatch_queue_create("com.example.MyQueue", NULL);
    dispatch_set_context(queue, @"xxx");
    dispatch_set_finalizer_f(queue, &myFinalizerFunction);
    for (int i = 0; i<1000; i++) {
        dispatch_async(queue, ^{
            NSLog(@"%d",i);
        });
    }
    dispatch_release(queue);


7. dispatch_sync(queue,task)  会阻塞当前线程 直到queue完成了你给的task, 但queue要完成你给的task,因为queue是FIFO的,意味着要完成之前的任务,才有机会执行你刚才给的task, 相当于当前线程等待queue里面所有任务执行完毕,  所以这句话不能在当前queue的任务代码里面调用,会造成死锁

    dispatch_queue_t queue = dispatch_queue_create("com.example.MyQueue", NULL);
    dispatch_set_context(queue, @"xxx");
    dispatch_set_finalizer_f(queue, &myFinalizerFunction);
    for (int i = 0; i<10; i++) {
        dispatch_async(queue, ^{
            NSLog(@"%d",i);
        });
    }
    NSLog(@"waiting");
    dispatch_sync(queue, ^{
        NSLog(@"wait done");
    });
    dispatch_release(queue);

2011-07-05 17:54:35.479 ttt[44203:207] waiting
2011-07-05 17:54:35.479 ttt[44203:1803] 0
2011-07-05 17:54:35.481 ttt[44203:1803] 1
2011-07-05 17:54:35.482 ttt[44203:1803] 2
2011-07-05 17:54:35.482 ttt[44203:1803] 3
2011-07-05 17:54:35.483 ttt[44203:1803] 4
2011-07-05 17:54:35.483 ttt[44203:1803] 5
2011-07-05 17:54:35.484 ttt[44203:1803] 6
2011-07-05 17:54:35.484 ttt[44203:1803] 7
2011-07-05 17:54:35.485 ttt[44203:1803] 8
2011-07-05 17:54:35.485 ttt[44203:1803] 9
2011-07-05 17:54:35.486 ttt[44203:207] wait done
2011-07-05 17:54:35.487 ttt[44203:1803] xxx


8. Waiting on Groups of Queued Tasks    //dispatch_sync只能对一个queue等待

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_group_t group = dispatch_group_create();
   
        // Add a task to the group
    dispatch_group_async(group, queue, ^{
        NSLog(@"first task");
    });
   
    dispatch_queue_t otherqueue = dispatch_queue_create("com.example.MyQueue", NULL);
    for (int i = 0; i<100; i++) {
        dispatch_group_async(group, otherqueue, ^{
            NSLog(@"otherqueue task");
        });
    }

    dispatch_group_wait(group, DISPATCH_TIME_FOREVER);

    NSLog(@"end waiting");

    dispatch_release(group);

2011-07-05 19:32:31.919 ttt[50138:5f03] otherqueue task
2011-07-05 19:32:31.919 ttt[50138:1803] first task
2011-07-05 19:32:31.922 ttt[50138:5f03] otherqueue task
2011-07-05 19:32:31.923 ttt[50138:5f03] otherqueue task
...
2011-07-05 19:32:32.078 ttt[50138:5f03] otherqueue task
2011-07-05 19:32:32.079 ttt[50138:5f03] otherqueue task
2011-07-05 19:32:32.080 ttt[50138:207] end waiting


9. Although you can obtain information about the underlying thread running a task, it is better to avoid doing so
分享到:
评论

相关推荐

    NSThread GCD

    dispatch_queue_t serialQueue = dispatch_queue_create("com.example.serialQueue", DISPATCH_QUEUE_SERIAL); dispatch_async(serialQueue, ^{ // 任务1 }); dispatch_async(serialQueue, ^{ // 任务2 }); ``` 在...

    多线程与GCD的简单使用

    简单的线程dome,适合初学者的使用, //dispatch_async(queue,^{});... //dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0) 得到全局队列 //diapatch_get_main_queue() 得到主线程,即UI队列

    关于block的一个demo

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_async(queue, ^{ // 执行耗时操作 dispatch_sync(dispatch_get_main_queue(), ^{ // 更新UI }); }); ``` ...

    Object-C语言入门教程&代码示例 .zip

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_async(queue, ^{ // 执行后台任务 dispatch_sync(dispatch_get_main_queue(), ^{ // 更新UI }); }); ``` ...

    GCDExcuteUITest Demo代码

    - **自定义队列**:开发者可以创建自己的串行或并行队列,通过`dispatch_queue_create()`函数实现。 - ** dispatch_async**:用于异步执行任务,不会阻塞当前线程。 - **dispatch_sync**:用于同步执行任务,如果...

    Block学习ios开发

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ // 执行耗时操作 dispatch_async(dispatch_get_main_queue(), ^{ // 更新UI }); }); ``` 这里的两个Block分别用于后台执行...

    多线程编程

    在《iOS并发编程指南》中,你将学习到如何利用GCD来实现并发,包括使用`dispatch_queue_create`创建队列、`dispatch_async`异步执行任务、`dispatch_sync`同步执行任务,以及如何使用barrier tasks来确保特定任务在...

    iOS音频视频课程文档

    dispatch_queue_t dispatchQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_async(dispatchQueue, ^{ // 初始化音频播放器 NSURL *fileURL = [[NSBundle mainBundle] ...

    linux线程池c源码

    - `work_queue_t *queue`:工作队列的指针。 #### 三、核心API 1. **`thrmgr_new`**:创建一个新的线程池实例。 - 参数: - `int max_threads`:线程池的最大线程数。 - `int idle_timeout`:线程空闲时的超时...

    iOS GCD-Program-master

    这个名为"IOS GCD-Program-master"的项目,显然旨在帮助开发者,即使是初学者,也能轻松掌握GCD的使用,包括线程操作、队列管理、定时器以及同步等待等功能。 1. **线程操作**:GCD提供了强大的并发编程工具,允许...

    swift异步下载网络图片

    dispatch_async(dispatch_get_main_queue()) { self.imageView.image = downloadedImage } ``` 或者,如果使用了`detachNewThreadSelector`,则可以将UI更新操作作为目标方法的一部分,使用`self....

    Constructing your own 地上爬梯好次 queues with GCD

    DispatchQueue.global(qos: .userInteractive) // 最高优先级 DispatchQueue.global(qos: .userInitiated) // 默认优先级 DispatchQueue.global(qos: .utility) // 较低优先级 DispatchQueue.global(qos: ....

    iOS 并发编程

    DispatchQueue是GCD中用于管理任务队列的概念。它有两个主要类型:串行队列(Serial Queue)和并发队列(Concurrent Queue)。串行队列保证任务按照添加的顺序依次执行,而并发队列则允许任务同时执行。开发者需要...

    IOS应用源码——一些iPhone开源项目代码ImagePickerDemo.zip

    ImagePickerDemo可能使用GCD来调度这些任务,例如用`dispatch_async`或`DispatchQueue.concurrentPerform`。 8. **UIImage与Core Graphics**:在处理图片时,开发者可能会使用Core Graphics框架来缩放、裁剪或处理...

    IOS线程学习文档+实例代码,特别适合新手学习,超好

    DispatchQueue.global(qos: .background).async { // 背景任务 DispatchQueue.main.async { // 更新UI } } ``` 3. OperationQueue:基于GCD的高级抽象,支持操作依赖、取消、优先级等功能。 ```swift let ...

    MBProgressHUD_Demo

    DispatchQueue.global().async { // 耗时操作... // 任务完成,隐藏指示器 DispatchQueue.main.async { hud.hide(animated: true) } } ``` 5. **自定义设置**:可以根据需要调整HUD的样式和行为。 ```...

    ProgressHUD

    DispatchQueue.global(qos: .background).async { // 模拟耗时操作 sleep(2) DispatchQueue.main.async { ProgressHUD.dismiss() // 在主线程中关闭加载指示器 } } ``` ProgressHUD提供了多种显示样式,包括...

    pocker_forTest.zipIOS应用例子源码下载

    6. **多线程处理**:异步操作和线程管理,如GCD(Grand Central Dispatch)或OperationQueue的使用,确保应用的流畅运行。 7. **错误处理与日志记录**:良好的错误处理和日志记录机制可以提高应用的稳定性和可维护...

    ios应用源码之感恩---奉上大量samplecode(第3部分) 19_18208_

    GCD(Grand Central Dispatch)和OperationQueue是iOS中的并发工具,它们可以帮助开发者有效地利用多核处理器,执行异步任务。这部分源码可能包含如何使用这些技术的例子。 动画和过渡效果让应用更具吸引力。UIKit ...

Global site tag (gtag.js) - Google Analytics