• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ios - 提供带有目标回调队列的异步和同步 API

[复制链接]
菜鸟教程小白 发表于 2022-12-12 13:17:38 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我正在编写一个网络 API。由于对 NSURLSession 的底层调用始终是异步的,因此我默认提供了一个异步 API:

- (void) callBackendServerWithCompletion: (dispatch_block_t) completion;

提供此 API 的同步版本也非常方便,例如简化在 Xcode Playground 中测试代码。同步调用是按照异步调用来写的:

- (void) callBackendSynchronously
{
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
    [self callBackendServerWithCompletion:^{
        dispatch_semaphore_signal(semaphore);
    }];
    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
}

这很好用。

现在我想添加一个额外的便利功能,一个默认调度队列来调用完成 block 。此回调队列默认为 UI 队列,因此此 API 的使用者不必一直 dispatch_async(dispatch_get_main_queue(), ^{…}):

// This:
[webservice callBackendServerWithCompletion:^{
    dispatch_async(dispatch_get_main_queue(), ^{
        [self updateUI];
    });
}];

// Would be replaced with this:
[webservice callBackendServerWithCompletion:^{
    // Guaranteed to run on the main queue
    [self updateUI];
}];

这很容易做到,但是现在我在主队列上调用同步方法时出现了死锁:

  1. -callBackendSynchronously 调用 -callBackendServerWithCompletion 并等待信号量。
  2. 异步方法处理网络请求并在主队列上调度回调。
  3. 由于主队列已经在等待信号量,所以代码会死锁。

提供所有三个功能的简单方法是什么,即。同步和异步 API 方法以及默认回调队列?



Best Answer-推荐答案


添加一个私有(private)的、重载版本的 callBackendServerWithCompletion 接受调度队列。在 callBackendSynchronously 中,使用自定义后台队列调用这个新的重载方法。

最后,在您原来的callBackendServerWithCompletion 方法中调用重载版本,将默认队列作为参数传递。

关于ios - 提供带有目标回调队列的异步和同步 API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43180988/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap