Tag: 大中央调度

Swift中的“暂停”游戏

我在Swift中创build了一个涉及怪物出现的游戏。 基于定时器,怪物出现并消失,使用这样的东西: func RunAfterDelay(_ delay: TimeInterval, block: @escaping ()->()) { let time = DispatchTime.now() + Double(Int64(delay * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC) DispatchQueue.main.asyncAfter(deadline: time, execute: block) } 然后我会像这样调用它(例如在2秒后产生): ///Spawn Monster RunAfterDelay(2) { [unowned self] in self.spawnMonster() } 然后我做一些类似的隐藏(x秒后,我把这个怪物去掉了)。 所以我在屏幕上方创build了一个设置图标,当你点击它的时候,一个巨大的矩形窗口会改变游戏设置,但是问题自然就是在后台产生的怪物。 如果我把玩家甩到另一个屏幕上,我相信我会失去我所有的游戏状态,如果没有全部开始(玩家可能处于游戏中),就不能回到游戏状态。 有没有办法告诉我在上面创build的所有游戏计时器,即 DispatchQueue.main.asyncAfter(deadline: time, execute: block) 当我这样说的时候暂停和恢复? 我想所有定时器都可以这样做(如果没有办法标记和暂停某些定时器的话)。 谢谢!

如何在asynchronous块内为dispatch_group_async调度dispatch_group_wait

我有这样的代码: [SVProgressHUD show]; [imageGenerator generateCGImagesAsynchronouslyForTimes:times completionHandler:^(CMTime requestedTime, …) { dispatch_group_async(queueGroup, queue, ^{ // Do stuff }); }]; dispatch_group_wait(queueGroup, DISPATCH_TIME_FOREVER); [SVProgressHUD dismiss]; 基本上,显示加载animationHUD,并开始从资产生成图像缩略图,然后一旦隐藏HUD。 我正在使用一个调度组,因为我想确保在隐藏HUD之前生成所有的缩略图。 但是当我运行它时,HUD立即被解雇。 我猜这是因为generateCGImagesAsynchronouslyForTimes: completionHandler:的asynchronous性质generateCGImagesAsynchronouslyForTimes: completionHandler: – dispatch_group_wait在completionHandler中的第一个dispatch_group_async之前被调用。 解决这种情况的优雅方法是什么? 谢谢。

问题与GCD和太多的线程

我有一个图像加载器类提供NSURL加载和图像从networking,并执行完成块。 代码其实很简单 – (void)downloadImageWithURL:(NSString *)URLString completion:(BELoadImageCompletionBlock)completion { dispatch_async(_queue, ^{ // dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ UIImage *image = nil; NSURL *URL = [NSURL URLWithString:URLString]; if (URL) { image = [UIImage imageWithData:[NSData dataWithContentsOfURL:URL]]; } dispatch_async(dispatch_get_main_queue(), ^{ completion(image, URLString); }); }); } 当我更换 dispatch_async(_queue, ^{ 与注释掉了 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ 图像加载速度要快得多,这是非常合乎逻辑的(在图像一次加载一个图像之前,现在一堆图像被同时加载)。 我的问题是,我可能有50个图像,我调用downloadImageWithURL:completion:方法,当我使用全局队列,而不是_queue我的应用程序最终崩溃,我看到有85 +线程。 问题是我连续50次调用dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH,0)会使GCD创build太多的线程吗? 我认为,gcd处理所有的treading,并确保线程的数量不是很大,但如果不是这样的话有什么办法可以影响线程数量?

如何在Swift 2.0中创build一个dispatch_block_t数组?

我有一个Swift 1.2中的代码来创build一个dispatch_block_t数组,它工作正常。 但是相同的代码在Swift 2.0中抛出错误。 var menuView: btSimplePopUP! let actions: [dispatch_block_t] = [{self.pickImages()}, {self.takePicture()}, {self.pickVideos()}, {self.shootVideo()}, {self.recordAudio()}, {self.closeView()}] menuView = btSimplePopUP(itemImage: imgs as [AnyObject], andTitles: titles as [AnyObject], andActionArray: actions as NSArray as [AnyObject], addToViewController: self) 上面的代码在Swift 1.2中工作正常。 但在Swift 2.0中,它会抛出以下错误 [dispatch_block_t]不能转换为NSArray 我怎样才能用dispatch_block_t创build一个NSArray? 更新: 我用下面的代码replace了上面的代码, let actions: [Any] = [{self.pickImages()}, {self.takePicture()}, {self.pickVideos()}, {self.shootVideo()}, {self.recordAudio()}, {self.closeView()}] menuView = […]

在一段时间后显示UIAlertView

我试图显示一段时间后UIAlertView(如在应用程序中做了5分钟后)。 我已经通知用户,如果应用程序closures或在后台。 但是我想在应用程序运行时显示一个UIAlertView。 我试图dispatch_async如下,但警报是永远popup: [NSThread sleepForTimeInterval:minutes]; dispatch_async(dispatch_get_main_queue(), ^{ UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"title!" message:@"message!" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:nil]; [alert show]; [alert release]; } ); 另外,我读了30到60分钟后线头死亡。 我希望能够在超过60分钟后显示警报。

NSOperationQueue vs GCD

在什么情况下,你宁愿使用NSOperationQueue不是GCD? 从我对这两者的有限经验来看,我认为NSOperationQueue基本上可以控制有多less并发操作。 GCD你不能这样做,因为你正在使用一个队列。 除了你可以用多核处理器模拟这个,但是我仍然觉得没有办法控制它。

在iOS中创build我自己的完成块

我有一个对象,需要很长时间做一些东西(它从服务器下载数据)。 我怎么写我自己的完成块,以便我可以运行… [downloader doSomeLongThing:^(void) { //do something when it is finished }]; 我不知道如何将这个块保存在下载器对象中。

Sprite Kit中可重复使用的multithreading实现

我正在做一个Sprite Kit游戏,我需要做一些multithreading来保持健康的fps。 在更新时,我调用一个函数来创build大量的UIBezierPaths,并使用C ++静态库合并它们。 如果我有超过10个形状的帧速率急剧下降,所以我决定给GCD尝试并尝试用单独的线程来解决这个问题。 我把这个放在didMoveToView: queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0); 并在每帧被调用的函数中,我称之为: dispatch_async(queue,^(void){[self heavyCalculationsFunc];}); 对于那些了解GCD的人来说,这可能是显而易见的,它会在每个框架上创build一个新的线索,但是对于我来说还不清楚。 我的问题是,是否有任何方法来重新使用我想调用更新的线程? 感谢您的帮助提前!

在下一次运行循环中执行:GCD有什么错误?

我正在尝试这两种方法: dispatch_async(dispatch_get_main_queue(),^{ [self handleClickAsync]; }); 和 [self performSelector:@selector(handleClickAsync) withObject:nil afterDelay:0]; 响应button按下。 第二个允许UIButton高亮所期望的,并在下一个运行循环中执行handleClickAsync (我想:“稍后”肯定)。 第一个不允许UIButton实例点亮,直到操作完成。 什么是正确的方法来做到这一点与GCD,或者是performSelector仍然是唯一的方法?

iOS MKMapShapshotter完成块并不总是被调用

我正在尝试使用新的iOS7 MKMapSnapshotter生成静态地图图像。 每当我的应用程序需要一张地图,我打电话给以下: MKMapSnapshotter *snapshotter = [[[MKMapSnapshotter alloc] initWithOptions:theOptions] autorelease]; dispatch_queue_t aQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0); DebugLog(@"Snapshotter allocated %@ and run on queue %@", snapshotter, aQueue); [snapshotter startWithQueue:aQueue completionHandler:^(MKMapSnapshot *snapshot, NSError *error) { DebugLog(@"Snapshotter completion block %@", snapshotter); // perform selector on main thread to set self.imageView.image = shanpshot.image; } 在大多数情况下,这是行之有效的。 然而有时候,这个设备看起来像是超载了地图请求,然后停止了渲染。 在我的日志文件中,我将看到关于“Snapshotter分配”的第一条日志语句,但从来没有看到“Snapshotter completion block”消息。 我的请求可能永远不会从调度队列中执行吗? […]