首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    iOS GCD编程之dispatch

    时 为串行 当队列为串行时 队列中的block按照先进先出(FIFO)的顺序去执行,实际上为单线程执行 当队列为并行时,没有固定的顺序,为多线程执行 队列执行 基本 dispatch_async 和 dispatch_sync...dispatch_sync(queue, ^{   //block具体代码 }); 实际编程经验告诉我们,尽可能避免使用dispatch_sync,嵌套使用时还容易引起程序死锁。...死锁例子 死锁例子1 如果queue1是一个串行队列的话,这段代码立即产生死锁: dispatch_sync(queue1, ^{ dispatch_sync(queue1, ^{     //......... });   //......  }); 死锁例子2 主线程中执行会死锁 dispatch_sync(dispatch_get_main_queue(), ^{   //.........然后可以用dispatch_async 或者 dispatch_sync将共享数据的访问代码封装起来: - (id)something { __block id localSomething;

    1.2K10

    iOS底层 - 关于死锁,你了解多少?

    在这些情况下,您可以使用dispatch_sync和dispatch_sync_f函数将任务添加到队列中。这些函数会阻塞当前的执行线程,直到指定的任务完成执行。...重要提示: 您永远不应从在您计划传递给函数的同一队列中执行的任务调用dispatch_sync或dispatch_sync_f函数。这对于保证死锁的串行队列尤其重要,但对于并发队列也应避免。...在GCD函数和队列篇章中,我们知道dispatch_syn函数的执行流程如下: dispatch_sync -> _dispatch_sync_f -> _dispatch_sync_f_inline...= _DISPATCH_LANE_TYPE)) { DISPATCH_CLIENT_CRASH(0, "Queue type doesn't support dispatch_sync");...= _DISPATCH_LANE_TYPE)) { DISPATCH_CLIENT_CRASH(0, "Queue type doesn't support dispatch_sync");

    49720

    当JavaScriptCore遇上多线程

    sleep"] = ^(int time) { sleep(time); }; context2[@"log"] = ^(NSString *str){ NSLog(@"%@", str); dispatch_sync...self.context1 = [[JSContext alloc] init]; self.context1[@"log"] = ^(NSString *str) { NSLog(@"%@", str); dispatch_sync...既然发生死锁了,那么我们就一步步庖丁解牛吧,从堆栈看,线程111由于有dispatch_sync,所以要等待主线程,这个比较好理解,可是主线程的堆栈全是JSCore相关代码,根本无从下手,但是从名字上看似乎与...TimerDidFire才被触发,这样主线程也不会被锁 但假如是工作线程先执行JS代码,VM的锁被工作线程持有了,然后主线程触发TimerDidFire,那么主线程就要等待工作线程释放VM的锁,然而这时工作线程又要dispatch_sync

    3.3K51

    GCD 概念解释方法:

    同步:你必须把我的代码执行完你再走,一定要执行完同步里的代码再执行下面的代码 void dispatch_sync(dispatch_queue_t queue, dispatch_block_t block...主队列: 遇到主队列,不管同步异步都要先执行完主线程里的代码再执行主队列里的代码 dispatch_sync方法不能在主队列中调用,因为这会无限期的阻止线程并会导致你的应用死锁。...@"begin"); for (int i = 0; i < 10; i++) { //死锁,一看同步就不分子线程了,一看主队列,就等着主线程执行完来执行里面代码 dispatch_sync...dispatch_async(dispatch_get_global_queue(0, 0), ^{ for (int i = 0; i < 10; i++) { dispatch_sync...同步:你必须把我的代码执行完你再走,一定要执行完同步里的代码再执行下面的代码 void dispatch_sync(dispatch_queue_t queue, dispatch_block_t block

    900130

    iOS多线程——你要知道的GCD都在这里你要知道的iOS多线程NSThread、GCD、NSOperation、RunLoop都在这里

    void *_Nullable context, dispatch_function_t work); /* 以同步方式执行任务,阻塞当前线程,必须等待任务完成当前线程才可继续执行 */ void dispatch_sync...而这里是使用同步提交到串行队列去执行任务,当第一个dispatch_sync方法执行后会阻塞当前线程,必须得等第一个任务完成后才能继续,所以这里的执行顺序是提交第一个任务后就开始执行而且得等到第一个任务完成后再去执行第二个...dispatch_sync方法用于提交第二个任务,以此类推。...currentThread], i); } }); } 执行程序后可以发现,不论输出多少次都是按Task1-3顺序输出,相信大家应该明白是为什么了,因为同步提交阻塞当前线程,第一个dispatch_sync...提交的任务完成以后当前线程才能去执行第二个dispatch_sync方法然后执行第二个任务。

    2K100

    深入理解GCD

    在这种情况下,dispatch_sync 就是一个绝好的候选。 dispatch_sync() 同步地提交工作并在返回前等待它完成。...如果你使用第二种情况做事,你将不时看到一个 __block 变量写在 dispatch_sync 范围之外,以便返回时在 dispatch_sync 使用处理过的对象。 但你需要很小心。...dispatch_sync 回顾 - (void)viewDidLoad { [super viewDidLoad]; dispatch_sync(dispatch_get_global_queue...主线程目前在 viewDidLoad 内,正要到达 dispatch_syncdispatch_sync Block 被添加到一个全局队列中,将在稍后执行。...全局队列处理 dispatch_sync Block 加入之前已经出现在队列中的任务。 终于,轮到 dispatch_sync Block 。 这个 Block 完成,因此主线程上的任务可以恢复。

    1.5K10

    扫码

    添加站长 进交流群

    领取专属 10元无门槛券

    手把手带您无忧上云

    扫码加入开发者社群

    热门标签

    活动推荐

      运营活动

      活动名称
      广告关闭
      领券