iOS 开发 block 等待 block 或 block 等待

这篇具有很好参考价值的文章主要介绍了iOS 开发 block 等待 block 或 block 等待。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 block 等待


在 iOS 开发中,如果你想要一个 block(闭包)等待执行完成,通常意味着你想要同步地执行这个 block,而不是异步地。然而,block 本身并不直接支持同步等待,因为它们是作为函数对象来设计的,可以异步地传递给其他方法或函数。

在 GCD (Grand Central Dispatch) 中,你可以使用 dispatch_sync 函数来同步执行一个 block,但这通常不推荐用于主线程,因为这会阻塞主线程,导致界面无响应。

下面是一个使用 dispatch_sync 在非主线程上同步执行 block 的例子:

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);  
dispatch_sync(queue, ^{  
    // 在这里执行你想要同步完成的任务  
    NSLog(@"This block will execute synchronously on the background queue.");  
});  
// dispatch_sync 会等待 block 执行完成后才继续执行后面的代码

请注意,如果你尝试在主线程上使用 dispatch_sync,会导致死锁,因为主线程会等待自己完成一个任务,这是不可能的。

如果你想要等待一个异步操作完成,通常的做法是使用信号量(semaphore)、回调闭包、Promise/Future 模式或者操作队列(Operation Queue)配合依赖关系。

使用信号量等待异步操作完成:

dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);  
  
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{  
    // 执行异步任务  
    NSLog(@"Async task is running.");  
    sleep(2); // 模拟耗时操作  
    NSLog(@"Async task finished.");  
    dispatch_semaphore_signal(semaphore); // 发送信号表示任务完成  
});  
  
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); // 等待信号  
NSLog(@"Continuing after async task.");

使用回调闭包等待异步操作完成:

void (^completionBlock)(void) = ^(){  
    // 异步任务完成后执行的代码  
    NSLog(@"Continuing after async task.");  
};  
  
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{  
    // 执行异步任务  
    NSLog(@"Async task is running.");  
    sleep(2); // 模拟耗时操作  
    NSLog(@"Async task finished.");  
    completionBlock(); // 调用回调闭包  
});

在这些情况下,重要的是要理解你的代码是如何在并发环境中运行的,并避免潜在的竞态条件和死锁。同步等待异步操作通常应该谨慎使用,因为它们可能导致线程阻塞和性能问题。 


 block 等待 block

在iOS中,你可以使用GCD(Grand Central Dispatch)来执行异步操作,并在完成时执行block。如果你想等待一个block完成,你可以使用dispatch_group_wait或者dispatch_group_notify。

以下是一个使用dispatch_group_wait的例子:

dispatch_group_t group = dispatch_group_create();
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
 
// 添加异步操作到group
dispatch_group_async(group, queue, ^{
    // 模拟耗时操作
    [NSThread sleepForTimeInterval:2];
    NSLog(@"Block 1 完成");
});
 
// 等待group中的所有任务完成
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
 
// 此处的代码会在所有block完成后执行
NSLog(@"所有block已完成");
 
// 清理group
dispatch_release(group);

如果你想在block完成时被通知而不是等待,你可以使用dispatch_group_notify:

dispatch_group_t group = dispatch_group_create();
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
 
// 添加异步操作到group
dispatch_group_async(group, queue, ^{
    // 模拟耗时操作
    [NSThread sleepForTimeInterval:2];
    NSLog(@"Block 1 完成");
});
 
// 设置一个block在group中的任务完成时被通知
dispatch_group_notify(group, queue, ^{
    NSLog(@"所有block已完成");
});
 
// 清理group
dispatch_release(group);

在这两个例子中,我们创建了一个group,并向其添加了一个异步任务。在第一个例子中,我们使用dispatch_group_wait来等待所有任务完成,在第二个例子中,我们使用dispatch_group_notify在任务完成时得到通知。记得在完成group的操作后释放group以避免内存泄漏。文章来源地址https://www.toymoban.com/news/detail-841740.html

到了这里,关于iOS 开发 block 等待 block 或 block 等待的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • iOS——Block one

    块类似于匿名函数或闭包,在许多其他编程语言中也存在类似的概念。 可以访问上下文,运行效率高 以下是块的一些基本知识: 块的定义 :块是由一对花括号 {} 包围的代码片段,可以包含一段可执行的代码。块的定义使用 ^ 符号,并可以带有参数列表和返回类型。例如:

    2024年02月14日
    浏览(40)
  • iOS——Block循环引用

    Capturing ‘self’ strongly in this block is likely to lead to a retain cycle 典型的循环引用 self 持有了 block block 持有了 self (self.name) 这样就形成了 self - block - self 的循环引用 强弱共舞 使用 中介者模式 __weak typeof(self) weakSelf = self 将循环引用改为 weakself - self - block - weakself 表面看上去还是一

    2024年02月14日
    浏览(30)
  • iOS——Block签名

    首先来看block结构体对象 Block_layout (等同于clang编译出来的 __Block_byref_a_0 ) 其中 Block_layout 是基础的block结构空间,而部分block则拥有 Block_descriptor_2 和 Block_descriptor_3 结构,其中的 flags 标识记录了一些信息 第1位:释放标记,一般常用BLOCK_NEEDS_FREE做位与操作,一同传入flags,

    2024年02月14日
    浏览(44)
  • iOS block以及变量捕获

    Block是什么 Block也是一个OC对象,内部也有isa指针。 扩展: instance对象的isa指向class对象 class对象的isa指向meta-class对象 meta-class对象的isa指向基类的meta-class对象 Block的类型 __NSGlobalBlock__(_NSConcreteGlobalBlock)(存放在数据区) (不访问auto变量的block 即便是访问了static局部变量 或者全

    2024年01月17日
    浏览(39)
  • Java NIO(Java Non-Blocking IO:非阻塞式IO)(2)

    1.NIO非阻塞网络编程相关的(Selector、SelectionKey、ServerScoketChannel和SocketChannel)关系梳理图: 说明: ①.当客户端连接时,会通过服务器端ServerSocketChannel得到/生成对应的SocketChannel; ②.通过register(Selector sel,int ops)方法将SocketChannel注册到Selector上(一个Selector上可以注册多个SocketChannel); ③

    2024年02月02日
    浏览(49)
  • 【Linux驱动】Linux阻塞IO —— 阻塞读取按键状态(等待队列实现)

    上一节获取按键状态时,是在应用层以循环的方式不断读取按键状态,但是我们实际关注的只是当按键被按下时发生的情况,所以大多数时间拿到的状态都是我们不需要的结果。 对此,当按键被释放时,让 read 接口处于阻塞状态,等按键被按下再解除阻塞。 要使用等待队列

    2024年02月02日
    浏览(43)
  • 利用scrapy框架对etherscan.io中给定Block范围内的交易信息的爬取

    一、 背景介绍 Etherscan 是 2015 年推出的一个以太坊区块探索和分析的分布式智能合同平台, 由于区块链中的交易信息等数据都是公开透明的 , 而 Etherscan 作为探索以太坊的窗口, 用户可以使用其查看自己的交易详情以及以太坊中的任何信息。 我们都有过这样的经历, 打开 taoba

    2024年02月12日
    浏览(50)
  • iOS问题记录 - type argument ‘nw_proxy_config_t‘ is neither an Objective-C object nor a block type

    升级Xcode 15后,意料之中,项目又遇到了问题。 Xcode: 15.0 CocoaPods: 1.12.1 flutter_inappwebview: 6.0.0-beta.24+1 Flutter项目在Xcode 15上编译时报错: 从报错信息看,是因为 nw_proxy_config_t 的类型不对导致的,错误发生在 flutter_inappwebview 库用到的 WebKit.framework 中,初步猜测可能是有什么新的

    2024年02月08日
    浏览(45)
  • iOS开发进阶(二):走近iOS原生开发

    在应用 uni-app 进行跨平台APP开发过程中,发现并不支持视频播放小窗功能,且插件市场提供的插件用户体验不好,遂决定自行开发 uni-app 原生插件。 uni-app 原生插件指的是将原生开发的功能按照规范封装成插件包,然后即可在 uni-app 前端项目中通过 js 调用开发的原生能力。

    2024年02月12日
    浏览(37)
  • iOS 小组件开发 && iOS 小组件开发用到的技术

    iOS 小组件开发 iOS小组件开发是指在iOS设备的主屏幕上添加自定义的小组件,用于显示特定的信息或提供简化的交互。iOS 14及更高版本引入了小组件功能,使用户能够在主屏幕上自定义并快速访问相关内容。 以下是iOS小组件开发的基本步骤: 设计小组件:首先,你需要设计小

    2024年02月11日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包