`
119568242
  • 浏览: 426969 次
  • 性别: Icon_minigender_1
  • 来自: 深圳/湛江
社区版块
存档分类
最新评论

[ios] dispatch_get_main_queue 的同步异步问题

    博客分类:
  • ios
 
阅读更多

 

    dispatch_sync(dispatch_get_main_queue(), ^(){

        NSLog(@"222");

    });

在ios中是无法使用 dispatch_sync(dispatch_get_main_queue()

原因如下:

在ios使用 dispatch_sync(dispatch_get_main_queue()^(){block体});

dispath向主队列加一个同步的block;

 

此时主队列在等待    dispatch_sync(dispatch_get_main_queue(),^(){block体});执行

dispatch_sync在等待主队列执行完毕。

造成死锁。

 

所以在ios使用主队列 dispatch_get_main_queue() 时 应该使用异步执行

dispatch_async(dispatch_get_main_queue(), ^(){

        NSLog(@"222");

    });

 

 

 

    dispatch_sync

则调用用    dispatch_sync的线程会等       dispatch_sync的对内容执行完再继续执行。

    dispatch_async

调用dispatch_async的线程不会的等dispatch_async的内容,自己继续执行。

 

 

dispatch_sync/async(dispatch_get_main_queue(),^(){block体})

只是将block加入到队列。执行顺序按照队列顺序

sync/async的区别在于 调用diapatch的线程是否等待dispatch执行完。

分享到:
评论

相关推荐

    ios demo,主队列,异步调度,手动创建线程,detachNewThreadSelector dispatch_get_main_queue

    本示例"ios demo,主队列,异步调度,手动创建线程,detachNewThreadSelector dispatch_get_main_queue"关注的是iOS中的四种主要线程管理方式:主队列、异步调度、detachNewThreadSelector以及dispatch_get_main_...

    iOS GCD开发总结整理

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_async(queue, ^{ // 执行任务 }); ``` **异步与同步提交** - **异步任务**:不会阻塞当前线程,可以立即返回...

    并发编程之Operation Queue和GCD

    串行队列是一种只能处理一个任务的队列,可以由用户调用dispatch_queue_create创建。并行队列可以同时处理多个任务,通常使用系统预定义的并行队列,即全局队列(Global Concurrent Dispatch Queues)。主队列是一个...

    IOS 多线程GCD详解

    #definedispatch_get_main_queue() \DISPATCH_GLOBAL_OBJECT(dispatch_queue_t, _dispatch_main_q) 可以看出,dispatch_get_main_queue也是一种dispatch_queue_t。 2)并行队列global dispatch queue,通过dispa

    gcd简介及应用实例及实例分析.txt

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_async(queue, ^{ // 执行任务 }); ``` 2. **创建本地串行队列**: ```swift dispatch_queue_t queue ...

    GCD常用和不常用API说明GCD-Demo-master.zip

    - 通过`dispatch_queue_create`创建自定义队列并使用`dispatch_async`异步执行任务。 - 使用`dispatch_get_main_queue`和`dispatch_get_global_queue`对比不同队列上的任务执行情况。 - `dispatch_after`的延时执行...

    Async.OC:Objective-C中的语法糖,用于Grand Central Dispatch中的异步调度

    异步OC 用Objective-C重写... 代替熟悉的GCD语法: dispatch_async (dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0 ), ^{ NSLog ( @" A: This is run on the background " ); dispatch_async ( dis

    OC- 全局队列-示例代码

    dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); ``` 在获取到全局队列后,我们可以通过`dispatch_async`函数将任务添加到队列中,实现异步执行。下面是一个简单...

    Cocoa多线程编程之 block 与 dispatch quene

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ // 这里的代码将在默认优先级的全局队列中异步执行 }); ``` 4. **主队列**:主队列是特殊的串行队列,所有的任务都会在主线程...

    变block成同步执行

    在这个例子中,`dispatch_get_main_queue()`会获取主线程的队列,而`dispatch_get_current_queue()`则获取当前线程的队列。`dispatch_sync`会将Block放入指定的队列并等待其执行完成。由于同步Block会阻塞调用它的...

    ios gcd

    - 有多个优先级可供选择,如` DISPATCH_QUEUE_PRIORITY_HIGH`、`DISPATCH_QUEUE_PRIORITY_DEFAULT`和`DISPATCH_QUEUE_PRIORITY_LOW`。 5. **GCD的时间控制**: - `dispatch_after()`函数允许在指定延迟后执行任务...

    ios 开发多线程

    - 创建DispatchQueue:`dispatch_queue_create()`用于创建自定义队列,`dispatch_get_main_queue()`和`dispatch_get_global_queue()`获取主线程队列和全局并行队列。 - 异步/同步提交任务:`dispatch_async()`异步...

    GCD使用经验与技巧浅谈 - CocoaChina_让移动开发更简单1

    通过`dispatch_queue_create`函数可以创建自定义的队列,其第二个参数用于指定队列类型。例如: ```swift let serialQueue = dispatch_queue_create("com.example.SerialQueue", DISPATCH_QUEUE_SERIAL) let ...

    GCDAsynchronousTest Demo代码

    dispatch_queue_t downloadQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); NSURL *imageURL = [NSURL URLWithString:@"http://example.com/image.jpg"]; NSMutableData *imageData = ...

    IOS GCD 多线程

    - 自定义串行队列通过`dispatch_queue_create()`创建。 2. **提交任务**: - 使用`dispatch_async()`提交异步任务到队列。 - 使用`dispatch_sync()`提交同步任务到队列。 3. **延迟执行**: 可以使用`dispatch...

    ios-用一张ImageView实现无限轮播条(支持自动、点击).zip

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ NSArray * array = @[@"0",@"1",@"2",@"3"];//本地图片数据 [banner ...

    IOS应用源码之多线程编程.zip

    - 并行队列:`dispatch_queue_create("queueName", DISPATCH_QUEUE_CONCURRENT)` 2. 将任务添加到队列: - 异步任务:`dispatch_async(queue, block)` - 同步任务:`dispatch_sync(queue, block)` 3. 主队列:`...

    GCDQueueTest Demo代码

    使用`dispatch_get_main_queue()`获取主队列。 5. **全局队列**:GCD还预定义了一些全局并行队列,可直接使用,无需创建。它们按优先级分为四个级别:高、默认、低和后台。 6. **栅栏函数**(`dispatch_barrier_...

    OC- 调度组-示例代码

    - 将任务提交到队列,比如全局并行队列:`dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ ... });` - 在任务的最后,离开调度组:`dispatch_group_leave(myGroup);` - 然后...

Global site tag (gtag.js) - Google Analytics