问题标签 [grand-central-dispatch]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
251 浏览

c++ - 是否可以从 C++ 标头构建 Objective-C++ 实现?

我有一个想在 Objective-C++ 中使用的 C++ 框架。我正在使用 XCode4 并针对 iPad 部署。

因此,鉴于此(伪代码)C++ 标头:

对于这个特定的实例,我需要doSomething通过 Grand Central Dispatch 发送一些东西。

我无法找到在 Objective-C++ 中实现 C++ 标头的解决方案。有可能这样做吗?如果是这样,有人可以提供一个很好的例子吗?

谢谢!

0 投票
1 回答
2152 浏览

ios - 在 iOS 中使用 dispatch_async 时出现内存警告

我有下面的代码,它以 30fps 的速度捕获 jpeg 帧并以 mp4 格式记录视频。我正在尝试将 processFrame 方法包装在 dispatch_async 调用中,以便录制过程不会锁定视频播放器。问题是我收到了 2 级内存警告,应用程序最终会在几秒钟后崩溃。我可以看到 dispatch_async 方法将队列加载到内存中,因为它试图将每一帧附加到录制的视频输出中,并且在 30fps 时,它没有足够的时间来处理帧并释放使用的内存。我尝试使用 dispatch_after 来延迟 processFrame 的执行,但它没有帮助。有任何想法吗?我应该以不同的方式做这件事吗?

这个方法每秒被调用大约 30 次。

处理框架方法

0 投票
2 回答
4502 浏览

concurrency - 使用 dispatch_async 的 EXC_BAD_ACCESS

我正在尝试通过 Objective-C++ 中的异步调度队列执行一个块。这是我正在尝试做的类片段......

我在 dispatchEventToSubscribers 方法中得到一个 EXC_BAD_ACCESS。当我检查它的值时_dude,XCode 告诉我它超出了范围。我只能假设我正在以this某种方式失败。检查并发文档:

对于您计划使用调度队列异步执行的块,从父函数或方法捕获标量变量并在块中使用它们是安全的。但是,您不应尝试捕获由调用上下文分配和删除的大型结构或其他基于指针的变量。当你的块被执行时,该指针引用的内存可能已经消失了。当然,您自己分配内存(或对象)并将该内存的所有权明确移交给块是安全的。

那么如何在this对象上异步调度方法呢?

谢谢!

0 投票
1 回答
1329 浏览

ios - 使用 GCD 实现并发读取独占写入模型

我试图了解使用 Grand Central Dispatch (GCD) 来实现控制对资源的访问的并发读取独占写入模型的正确方法。

假设有一个 NSMutableDictionary 被大量阅读并且偶尔更新。确保读取始终以字典的一致状态工作的正确方法是什么?当然,我可以使用队列并序列化对字典的所有读写访问,但这会不必要地序列化应该允许同时访问字典的读取。起初,在这里使用组听起来很有希望。我可以创建一个“读取”组并将每个读取操作添加到其中。这将允许读取同时发生。然后当需要进行更新时,我可以将 dispatch_notify() 或 dispatch_wait() 作为写入操作的一部分,以确保在允许更新继续之前完成所有读取。但是,如何确保在写入操作完成之前不会开始后续的读取操作?

这是我上面提到的字典的一个示例:
R1:在 0 秒时,读取进入,需要 5 秒才能完成
R2:在 2 秒时,另一个读取进入,需要 5 秒才能完成
W1:在 4 秒时,写入操作来需要访问字典 3 秒
R3:在 6 秒时进行另一次读取,需要 5 秒才能完成
W2:在 8 秒时,另一次写入操作也需要 3 秒才能完成

理想情况下,上面应该这样播放:
R1 从 0 秒开始,在 5 秒结束
R2 从 2 秒
开始,在 7 秒结束 W1 从 7 秒
开始,在 10 秒结束 R3 从 10 秒开始,在 15 结束
W2 从 15 秒开始, 结束于 18

注意:虽然 R3 6 秒来了,但是因为 W1 来得早,所以不允许在 W1 之前开始。

用 GCD 实现上述内容的最佳方法是什么?

0 投票
1 回答
1386 浏览

objective-c - 每个 NSThread 都有自动调度队列吗?

默认情况下,每个线程都有关联的调度队列吗?我只是想知道是否可以dispatch_semaphore在每个上下文中使用 s,或者是否需要将它包装在具有定义队列的显式调度调用中。

0 投票
1 回答
4599 浏览

iphone - 生成调度源计时器事件时发生内存泄漏

我们使用调度队列来生成定时器事件。以下是执行该任务的代码:

这工作得很好,除了当我们运行分析器时,我们看到这些方法有很多内存泄漏:

  • dispatch_source_create
  • dispatch_source_set_timer
  • dispatch_source_set_event_handler

我们已确保使用 dispatch_release() 方法释放计时器。

如果我们在上面的代码中犯了任何错误,有人可以告诉我们吗?而且,如果您可以指出任何计时器事件生成的示例,那将会很有帮助。

0 投票
1 回答
386 浏览

c++ - 带有局部变量声明的 dispatch_apply 不能在 C++ 方法实现中编译

编码

不编译,说“'int XXX::j'不是'class”的静态成员。块上的文档说“在块的词法范围内声明的局部变量,其行为与函数中的局部变量完全相同。”该文件具有 .mm 扩展名。我错过了什么?

0 投票
1 回答
1127 浏览

c - Dispatch Source Reader - 如何检测文件结束?

Apple 文档的启发,我正在尝试使用 GCD 调度源从文件中异步读取,而不是使用传统NSInputStream的基于运行循环的方法。

但是,我不确定如何检测我何时完成读取文件。使用NSInputStream,您的代表会收到一个NSStreamEventEndEncountered事件。对于调度源,我假设事件处理程序会在文件末尾被调用,但情况似乎并非如此。我错过了什么?

这是我的代码:

0 投票
3 回答
20558 浏览

ios - Grand Central Dispatch 与 NSThread

我为 NSThread 和 Grand Central Dispatch (GCD) 创建了一些测试代码:

结果:

NSThreads 像我预期的那样工作:任务并发运行,每个线程休眠 1 秒。

dispatch_apply 没有像我预期的那样工作:为什么顺序是顺序的?为什么每个循环都等到前一个循环完成?

谢谢您的帮助。

0 投票
3 回答
648 浏览

objective-c - Objective C - 块问题?

我有以下方法

我怎样才能使块同步完成它的工作,以便它在被检索之前不返回结果?