grand-central-dispatch相关内容
使用SWIFT的新异步/等待功能,我想模拟串行队列的调度行为(类似于过去使用DispatchQueue或OperationQueue的方式)。 稍微简化一下我的用例,我有一系列的异步任务,我想从调用站点发出它们,并在它们完成时得到回调,但根据设计,我一次只想执行一个任务(每个任务都依赖于前一个任务的完成)。 今天,这是通过将Operation放在带有maxConcurrentOperati
..
我做错了什么?在操场上,它像它应该运行的那样运行。但一旦我在iOS模拟器上部署它,它就会返回错误的序列。 @objc func buttonTapped(){ let group = DispatchGroup() let dispatchQueue = DispatchQueue.global(qos: .default) for i in 1...4 {
..
我找到了Apple的文档,了解为什么我应该使用Run循环来实现主调度队列中的任务。 根据Apple docs, 主派发队列是在应用程序的主线程上执行任务的全局可用的串行队列。此队列与应用程序的运行循环(如果存在)配合使用,以使排队任务的执行与附加到运行循环的其他事件源的执行交错。因为它在应用程序的主线程上运行,所以主队列为应用程序的关键同步点。 但是,我仍然不能理解为什么需要运行循环
..
我有以下代码,它使用DispatchGroup在任务完成时收到通知: func getSomething(completion: ()->()) { completion() } func doSomeWork(completion: ()->()) { let myGroup: DispatchGroup = DispatchGroup() for _ in 0.
..
我使用SWIFT 3 GCD在代码中执行一些操作。但我经常收到_dispatch_call_block_and_release错误。我想这个错误背后的原因是因为不同的线程修改了相同的变量,但我不确定如何修复这个问题。以下是我的代码和解释: 我有一个变量可以在不同的线程中访问和修改: var queueMsgSent: Dictionary? = nil
..
我在后台线程上运行的类中使用DispatchGroup。有时,我需要更新UI,因此我调用以下代码: dispatchGroup.notify(queue: .main) { self.delegate?.moveTo(sender: self, location: location) self.delegate?.updateLabel(sender: self, item: sel
..
我需要澄清dispatch_queues与重入性和死锁的关系。 阅读这篇博客文章Thread Safety Basics on iOS/OS X,我遇到了这样一句话: 所有调度队列都是不可重入的,这意味着您将在以下情况下死锁 您尝试在当前队列上调度_SYNC。 那么,可重入性和死锁之间有什么关系呢?如果dispatch_queue是不可重入的,为什么使用dispatch_sync调用
..
class SomeViewController: UIViewController { let semaphore = DispatchSemaphore(value: 1) deinit { semaphore.signal() // just in case? } func someLongAsyncTask() { sem
..
有没有办法在延迟后调用带有原始参数的块,例如使用 performSelector:withObject:afterDelay: 但带有像 int/double/float? 解决方案 我想你正在寻找 dispatch_after().它要求您的块不接受任何参数,但您可以让块从本地范围捕获这些变量. int 参数1 = 12;浮动参数2 = 144.1;//延迟执行我的块 10 秒.dis
..
..
在使用 GCD 时,我们希望等到两个异步块执行完毕后再继续执行下一步.最好的方法是什么? 我们尝试了以下方法,但似乎不起作用: dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^ {//块 1});dispatch_async(dispatch_get_global_queue(DISPA
..
我正在开发将通过 BLE 与智能设备连接并与之通信的应用程序. 问题是:处理蓝牙事件的最佳做法是在哪个队列中? 我已经阅读了很多教程,在所有教程中我都发现了这一点: centralManager = CBCentralManager(delegate: self, queue: nil) 他们选择在主队列(queue: nil)中处理蓝牙事件,但我认为这不是一个好习惯.因为可能有很
..
我有一个方法,有时可以在我的代码中调用.下面是一个非常基本的示例,因为代码处理了 iphone 照片库中的图像和文件,并在使用该方法完成时将它们标记为已处理. @property (nonatomic, assign) dispatch_queue_t serialQueue;……-(void)processImages{dispatch_async(self.serialQueue, ^{//
..
我正在将一些代码从 C++ 移植到使用 Grand Central Dispatch 的 Swift,我发现 dispatch_queue_create 的一个奇怪错误似乎根本不起作用. 例如,在我的 C++ 基类头文件中,我会声明 dispatch_queue_t m_WorkQ; 然后在初始化器中放入 m_ResultQ = dispatch_queue_create("com.m
..
我正在努力理解 Grand Central Dispatch 的概念.我想从 Vandad 的并发编程一书中理解这些引语. GCD 的真正用途是将任务分派到多个内核,而不必让程序员担心哪个内核正在执行哪个任务. 和 GCD 的核心是调度队列.调度队列是线程池. 最后 您不会直接使用这些线程.您将只使用调度队列,将任务调度到这些队列并要求队列调用您的任务. 我已将
..
..
我有一个带有 UIImageView 子视图的 UIView.我需要在不阻塞 UI 的情况下在 UIImageView 中加载图像.阻塞调用似乎是:UIImage imageNamed:.这是我认为解决此问题的方法: -(void)updateImageViewContent {调度异步(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACK
..
我在 viewDidLoad 中有以下代码,它在 iOS 4.3 上正常工作,但在 iOS 5/5.1 上挂起.在 iOS 5/5.1 上,警告对话框显示但无法关闭,UI 线程冻结,无法单击 OK 按钮. dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{dispatch_sync(di
..
我发现正如我在将图像写入文件时所预测的那样,我的 UI 在此期间被阻止,这是不可接受的.当我将图像写入文件时,我会发布一个 NS 通知,以便我可以做一些与该完成相关的其他特定工作.原始工作但 UI 阻塞代码: -(void)saveImageToFile {NSString *imagePath = [self photoFilePath];BOOL jpgData = [UIImageJPEG
..
我遇到的唯一功能差异是我可以取消使用 performSelector:withObject:afterDelay: 安排的消息.我不知道有什么方法可以取消提交给 dispatch_after 的块.(如果有我不知道的方法,请告诉我). 我想了解更多: 功能权衡(用一个接口而不是另一个接口可以实现什么?) 性能权衡(一种实现更有效吗?在哪些情况下?) 风格上的权衡(我是否应该为某些任
..