使用 Grand Central Dispatch,我如何检查是否有一个块已经在运行?

2023-12-12

我正在使用 GCD 从互联网上进行一些后台加载。除了一点缺陷之外,这效果很好。在我的应用程序中,我有 3 个选项卡,当单击任何选项卡时,GCD 开始为相应的选项卡进行后台加载。如果用户决定从第一个选项卡转到第二个选项卡(当 GCD 已开始下载第一个选项卡的数据时),然后再次返回到第一个选项卡。 GCD 将启动另一个后台线程(即使第一个后台线程尚未完成数据下载)。

那么有没有办法检查后台线程当前是否正在运行?这样,如果用户选择非常快速地来回切换选项卡(出于某种原因),它就不会启动多个后台线程。


如果你想阻止两个相同类型的块同时运行,你可以使用调度信号量。将信号量设置为 1 后,您可以在触发块之前检查信号量,并在某些内容仍在运行时进行保释。在块的末尾,您向信号量发出信号以允许提交其他块。

我在我的一个应用程序中执行此操作是为了防止一次将多个 OpenGL ES 帧渲染块添加到队列中(如果一帧渲染时间超过 1/60 秒,则防止队列中的块堆积)。我在回答中描述了其中一些内容here,使用以下代码:

if (dispatch_semaphore_wait(frameRenderingSemaphore, DISPATCH_TIME_NOW) != 0)
{
    return;
}

dispatch_async(openGLESContextQueue, ^{

    [EAGLContext setCurrentContext:context];

    // Render here

    dispatch_semaphore_signal(frameRenderingSemaphore);
});

where frameRenderingSemaphore之前创建的如下:

frameRenderingSemaphore = dispatch_semaphore_create(1);

如果您为每个选项卡的下载操作创建一个类似的信号量,则可以进行检查以确保该选项卡一次不会有多个下载排队。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Grand Central Dispatch,我如何检查是否有一个块已经在运行? 的相关文章

  • scrollToRowAtIndexPath:atScrollPosition:动画滚动太慢

    基于分页 UIScrollView 的页面更改 我正在调用scrollToRowAtIndexPath atScrollPosition animated到所显示的该页面的表详细信息 void scrollViewDidScroll UIS
  • 如何在 iPhone 应用程序的 url 中传递字符串值

    NSURLRequest request NSURLRequest requestWithURL NSURL URLWithString http www krsconnect no community api html method ba
  • NSMutableData 删除字节?

    我可以使用以下命令轻松地将字节添加到 NSMutableData 实例appendData方法 但是我没有看到任何类似的删除数据的方法 我是否忽略了某些内容 或者我是否需要创建一个新对象并仅复制我需要的字节 请参阅以下方法的文档 void
  • 使用捏合手势;如何放大用户手指实际“捏”的位置?

    我已经在我的应用程序中的 UIImageView 上实现了 UIPinchGestureRecognizer 但是无论我在图像的哪个位置捏合 它似乎都会放大到同一个位置 有谁知道我如何让它放大到用户实际 捏 的地方 请参阅下面的代码 视图控
  • 我可以使用 NSDateFormatter 将此日期字符串转换为 NSDate 吗?

    我有这个字符串 2010 08 24T16 00 00 05 00 我想从中提取时间部分 即 16 00 并将其转换为 12 小时等效值 即下午 04 00 我正在尝试使用 NSDateFormatter 来完成此任务 但它不起作用 NSD
  • Swift NotificationCenter 删除观察者最快的方法

    我正在添加一些观察员viewController applicationWillResignActive applicationDidEnterBackground 以及许多其他人 我想删除self作为一行中所有已注册通知的观察者 我的问题
  • 从 NSString 的第一行删除换行符

    我怎样才能删除第一个 nNSString 中的字符 编辑 只是为了澄清一下 我想做的是 如果字符串的第一行包含 n 字符 请将其删除 否则不执行任何操作 即 如果字符串是这样的 nhello this is the first line n
  • 取消交互式 UINavigationController 弹出手势不会调用 UINavigationControllerDelegate 方法

    如果拖动 a 的边缘UIViewController开始交互式流行过渡UINavigationController the UIViewController在电流下方有viewWillAppear 调用 然后是UINavigationCon
  • 将 HTML 字符串加载到 UIWebView 中的延迟

    我在导航控制器中有两个视图控制器 第一个视图控制器有一个带有按钮的菜单 按下此按钮将移动到第二个视图控制器并将 html 字符串加载到 UIWebView 中 没有其他东西被加载到 webview 中 只是一个简单的 NSString 其中
  • 无限 UIScrollView 在 iOS4.3 中出现奇怪的行为,而不是 iOS5

    我已经实现了一个包含 UIView 的无限 UIScrollView 在 iOS5 模拟器和 iPhone 中滚动时 效果非常好 但在 iOS 4 3 sim 和手机 中 情况有点疯狂 滚动条传递的视图比应有的多 大约比 iOS5 多 10
  • Apple 推送通知徽章编号

    我开发了服务器端应用程序 以在收到新通知后将徽章编号维护为递增或递减 并在看到通知后删除它工作正常 但是显示徽章时存在一些问题 实际情况是 在设备上收到新通知后 我单击取消按钮 然后徽章编号正确显示 但之后我将打开应用程序并关闭应用程序徽章
  • StoryBoard 2 导航控制器指向相同的视图

    有谁知道为什么这不起作用 这样 只有一个选项卡栏加载视图 另一个选项卡栏则显示黑屏 我在没有导航控制器的情况下尝试过 选项卡栏是正确的 而另一个在运行模式下不显示选项卡栏项目 如果有人感兴趣的话我对这个问题的回答 添加两个视图来启动我们感兴
  • 标签中的文字大小

    如何限制标签中的字符数 您可以通过设置自动截断带有省略号的文本frame of the UILabel NSInteger newSize 10 label frame CGRectMake label frame origin x lab
  • 使用 iOS 设备作为 TCP 客户端 - 无 Bonjour

    我想使用 iOS 设备作为 TCP 客户端 但我找不到可理解的 API 指南 示例来说明如何做到这一点 我试过SimpleNetworkStreams and PictureSharing 但他们都使用 Bonjour 我可以轻松建立 UD
  • 多点触摸检测和区分 - Cocos2d for iPhone

    我想知道如何在多点触摸视图中检测和区分触摸 我读过有关 哈希 代码的内容 但我不明白如何使用它 我想知道我的两个精灵何时被同时触摸 就像在钢琴的两个琴键上按下和弦一样 编辑 以下是我的 TouchesBegan 的示例 void ccTou
  • 获取 Swift 子目录中资源的所有 URL

    我正在尝试为 iOS 应用程序的子目录中的所有资源创建 URL 数组 我似乎无法到达正确的路径 即使我不知道名称 我也希望能够检索 URL 即我不想将文件名硬编码到代码中 Below is a screen shot of the hier
  • Apple Mach-O 链接器错误 armv7s 和 libGoogleAdMobAds.a

    我刚刚升级了我的应用程序以在新的 iPhone5 模拟器上运行 但是当我尝试为我的 iPhone 4S 设备构建它时 我收到此 Apple Mach O Liner 错误 ld 文件是通用的 3片 但不包含 n armv7s 切片 User
  • iPhone,如何将一张图像叠加到另一张图像上以创建要保存的新图像? (水印)

    基本上 我想拍摄用户从照片库中选择的图像 然后应用水印 即右下角的三角形 上面有应用程序名称 我已经在 Photoshop 中用透明层制作了第二张图像 我尝试了一个函数 我不记得它的确切名称 但它涉及 CGIImages 和蒙版 这将两个图
  • UINavigationController 在后退按钮单击时向下滚动

    我正在开发一个带有多个导航控制器的 iPhone iPad 应用程序 当我在设备处于横向模式时单击视图的后退按钮时 前一个视图会垂直滚动到屏幕中 而不是像往常一样水平滚动 推送动画始终水平工作 正如它应该的那样 是什么导致了这个奇怪的问题
  • AVAudioMixerNode pan 或 AVAudioUnitSamplerstereoPan 属性无法更改 AVAudioEngine 声音输出的左/右平衡

    我有以下代码 它播放单个 MIDI 音符 但我希望能够调整平衡 平移 以便它仅从左扬声器或右扬声器或某些组合中播放 我认为更改 sampler stereoPan 或 engine mainMixerNode pan 也许可以解决问题 但它

随机推荐

  • 最小化 C 中浮点错误的经验法则?

    关于最小化浮点运算中的错误 如果我在 C 中有如下操作 float a 123 456 float b 456 789 float r 0 12345 a a r b 如果我将乘法和减法步骤分开 计算结果会改变吗 即 float c r b
  • 使用 foreach 从数据库中获取数据 - 从上到下

    数据库 id name 1 aaa 2 bbb 3 ccc 250 zz3 foreach datafromdb as value echo value gt name 这告诉我 aaa bbb ccc zz3 从左到右 if table
  • 使用 DNS 重定向到另一个带有路径的 URL [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我正在尝试通过 DNS 将一个域重定向到另一个域 我知道使用 IN CNAME 是可能的 www proof com IN CNAME www proof two com 我需要的是
  • 在 JavaScript 中停止回发

    我有一个带有 JQuery Thickbox 的 ASP Web 表单 我有一个在用户单击时打开 Thickbox 的图像 一旦打开厚盒 它会向我显示一个包含多行的网格和一个用于选择一行的按钮 在用户选择记录后 它返回到所选记录的主页并导致
  • Cordova本地通知Android插件2.2升级

    我正在使用 Phonegap Cordova 2 2 在 Android 上开发 提醒 应用程序 用户输入一个具体的提醒日期 我应该准时通知他 我使用 Android 的通知插件 但它支持早期版本的手机间隙 我按照本教程解决了cordova
  • Xamarin.Forms 中选项卡式页面中的标题截止

    Android 中的标签页标题被截断 但在 iOS 设备上运行良好 我正在使用这个代码 public Tabbar this BarTextColor Color Maroon New Feed var navigationNewFeed
  • 嵌套函数的实现

    我最近发现gcc允许定义嵌套函数 在我看来 这是一个很酷的功能 但我不知道如何实现它 虽然通过传递上下文指针作为隐藏参数来实现对嵌套函数的直接调用当然并不困难 但 gcc 还允许获取指向嵌套函数的指针并将该指针传递给任意其他函数 该函数又可
  • 向表中的每一行插入一个随机数

    我目前有一个包含大约 600 000 行的 oracle 表 lovalarm 我需要能够运行一个查询 该查询将循环遍历每一行并将字段 lovsiteid 更新为 14300 到 17300 之间的随机数 到目前为止我有 update lo
  • 一天的时间跨度怎么可能只有 8 个小时?

    我保存了以分钟为单位的持续时间 并希望输出 1 天 5 小时 30 分钟 目前 我将分钟添加到时间跨度中并执行如下操作 TimeSpan ts new TimeSpan 0 0 1800 0 Response Write ts Days d
  • 如何使用Beautifulsoup解析网站

    我是网络抓取新手 我想获取页面的 html 但是当我运行该程序时 我得到 html 为空并且控制台显示 javascript from bs4 import BeautifulSoup import requests import urll
  • 未指定网络安全配置,使用平台默认值

    我正在尝试打印值列表ListView来自网页 我有这两个权限
  • 在 Jquery 中创建无限循环

    HTML结构是这样的 ul class innerfade li style display none some Text li li style display none bla bla bla li li style display n
  • 如何在psql中切换数据库?

    在MySQL中 我使用了use database name 什么是psql相等的 在 PostgreSQL 中 您可以使用 connect客户端工具psql的元命令 connect DBNAME 或者简而言之 c DBNAME
  • 使用 NEST C# 在 Elastic Search 中使用多个索引进行全文搜索

    我正在尝试使用 NEST 客户端搜索多个索引 Elasticsearch 我只需点击以下链接 叠加帖子 如何使用 Nest ElasticSearch 在多个索引内进行搜索 唯一的区别是我的索引已经存在但没有返回 示例代码 using Sy
  • 单击子元素也会触发其父元素的单击事件[重复]

    这个问题在这里已经有答案了 Scenario 我的主干应用程序中的视图由几个部分组成boxes which are div elements 当用户单击一个框并按住鼠标按钮 500 毫秒时 我想显示一个delete左上角的按钮 当用户点击其
  • C++ 委托构造函数

    你好 我对 Java 比 C 更熟悉 test h class Test private int a b c public Test int a int b int c test c Test Test int a int b int c
  • 如何使用 FTP 下载 R 包

    我需要在无法访问 Internet 的 Windows 7 PC 上支持 R 环境 我想下载 最终下载到 DVD 所有 5 000 个软件包的当前版本 以供这台 PC 上的 R 用户使用 是否有 FTP 脚本或其他好方法来下载 R 包的所有
  • 如何每500ms获取一次相机预览帧

    我正在开发示例应用程序 它通过 android 中的相机为我提供指向图像或对象的颜色代码 我的应用程序与此应用程序类似 我正在使用this为此的应用程序代码 使用此应用程序代码 我可以连续获取相机预览帧 并为我提供当前预览帧的颜色代码 我想
  • NotificationHub推送通知返回:从Token Provider获取的Token错误

    我有 Wp8 1 Silverlight 应用程序 它从 Mobileservice 旧的 azure 服务 接收推送通知 WNS 因此 由于新功能 我想更新到新服务 我现在已经创建 升级了一个新服务器以使用应用程序服务 移动应用程序 并使
  • 使用 Grand Central Dispatch,我如何检查是否有一个块已经在运行?

    我正在使用 GCD 从互联网上进行一些后台加载 除了一点缺陷之外 这效果很好 在我的应用程序中 我有 3 个选项卡 当单击任何选项卡时 GCD 开始为相应的选项卡进行后台加载 如果用户决定从第一个选项卡转到第二个选项卡 当 GCD 已开始下