如何实现不执行首个方法的dispatch_async第二种调用方式?附代码场景
调整GCD调用结构并跳过指定方法的解决方案
嘿,我来帮你搞定这个问题!首先梳理下你的需求:你原本的代码里嵌套了dispatch_async调用,现在想换一种GCD的使用方式,同时完全跳过[self GetFullImage:firstID]这个方法。下面给你两种可行的方案:
方案1:简化嵌套结构,直接在主队列执行目标逻辑
原代码里的双层主队列异步嵌套其实没必要(因为都是在同一个主队列),既然要去掉获取原图的步骤,我们可以直接把所有需要执行的逻辑放在一个主队列异步任务里,结构更清晰:
NSString *firstID = @"https://wallpaperbrowse.com/media/images/soap-bubble-1958650_960_720.jpg"; // 直接在主队列异步执行所有需要的逻辑,跳过GetFullImage dispatch_async(dispatch_get_main_queue(), ^{ NSLog(@"0"); NSLog(@"1"); NSLog(@"2"); // 记得确保PAN变量已经正确初始化,不然分享控制器会出问题 UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:PAN applicationActivities:nil]; // 这里可以加分享控制器的展示逻辑 [self presentViewController:activityViewController animated:YES completion:nil]; });
方案2:使用自定义队列+主队列切换(另一种GCD调用方式)
如果想换一种更规范的GCD使用方式(比如把非UI逻辑和UI逻辑分开),可以创建一个自定义串行队列来处理非UI部分,再切回主队列处理分享控制器:
NSString *firstID = @"https://wallpaperbrowse.com/media/images/soap-bubble-1958650_960_720.jpg"; // 创建自定义串行队列,用来处理非UI任务 dispatch_queue_t customShareQueue = dispatch_queue_create("com.yourapp.share-processing", DISPATCH_QUEUE_SERIAL); dispatch_async(customShareQueue, ^{ // 这里可以放原本的非UI预处理逻辑(现在去掉了GetFullImage,就只打日志) NSLog(@"0"); NSLog(@"1"); // 切回主队列处理UI操作(分享控制器属于UI,必须在主队列创建和展示) dispatch_async(dispatch_get_main_queue(), ^{ NSLog(@"2"); UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:PAN applicationActivities:nil]; [self presentViewController:activityViewController animated:YES completion:nil]; }); });
几个重要的注意点:
- 直接移除
[self GetFullImage:firstID]就能实现不执行这个方法的需求,不用额外做其他操作 - 所有UI相关的操作(比如创建和展示
UIActivityViewController)必须在主队列执行,这一点一定要注意 - 确保
PAN变量在执行到创建分享控制器的代码时已经正确赋值,不然会导致初始化失败
内容的提问来源于stack exchange,提问作者user9137841
相关产品推荐
相关产品推荐

