Tag: 大中央调度

如何在没有达到全球GCD限制的情况下并行执行许多(100+)任务?

问题是 : 当在后台中延迟加载100个图标列表时,我点击了GCD线程限制(64个线程),这导致我的应用程序在主线程上通过semaphore_wait_trap冻结。 我想重构我的线程代码,以防止这种情况发生,同时仍然加载图标asynchronous,以防止UI阻塞。 背景 : 我的应用程序加载了一个SVG图标的屏幕。 金额平均从10-200不等。 通过使用本地SVG图像或远程SVG图像(如果它具有自定义图标)绘制图标,然后对它们进行后处理以获得最终的图像结果。 因为这需要一些时间,而且对用户来说不是至关重要的,所以我想在后台加载和后处理它们,所以它们会随着时间的推移而popup。 对于每个图标我使用以下内容: dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_async(concurrentQueue, ^{ //code to be executed in the background SVGKImage *iconImage = [Settings getIconImage:location]; dispatch_async(dispatch_get_main_queue(), ^{ //code to be executed on the main thread when background task is finished if (iconImage) { [iconImgView setImage:iconImage.UIImage]; } }); }); getIconImage方法处理基本SVG的初始加载,如果它是本地的,它将与[NSInputStream inputStreamWithFileAtPath:path]同步读取,如果它应该远程加载, […]

混合同步/asynchronous与串行/并发队列时,调度程序如何工作?

在Grand Central Dispatch中,在使用dispatch_sync函数和dispatch_async函数时, dispatch_sync如何使用不同的队列( serial和concurrent )?

imageWithCGImage:GCD内存问题

当我只在主线程执行以下操作时, iref立即获得autoreleased: -(void)loadImage:(ALAsset*)asset{ @autoreleasepool { ALAssetRepresentation* rep = [asset defaultRepresentation]; CGImageRef iref = [rep fullScreenImage]; UIImage* image = [UIImage imageWithCGImage:iref scale:[rep scale] orientation:UIImageOrientationUp]; [self.imageView setImage:image]; } } 但是当我执行imageWithCGImage时:在后台线程上使用GCD iref不会像第一个例子那样立即被释放。 只有一分钟后: -(void)loadImage:(ALAsset*)asset{ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void) { @autoreleasepool { ALAssetRepresentation* rep = [asset defaultRepresentation]; CGImageRef iref = [rep fullScreenImage]; UIImage* image = [UIImage imageWithCGImage:iref scale:[rep scale] orientation:UIImageOrientationUp]; […]

asynchronousswift 3

我需要进行asynchronous调用,以便第二个方法只在第一个方法完成后调用。两种方法都是networking调用。 像这样的东西: signIn() getContacts() 我想确保getContacts只在signIn完成后被调用。 FWIW,我无法编辑方法签名,因为它们来自Google SDK。 这是我试过的: let queue = DispatchQueue(label: "com.app.queue") queue.async { signIn() getContacts() }

MKOverlayView性能

我在地图上添加了大约3000个MKOverlay,正如你所想象的那样,有时需要一些时间,大约有八秒。 我正在寻找一种使用线程来提高性能的方法,因此用户可以在添加覆盖图时移动地图。 优选地,叠加层将按顺序添加,从地图区域内的开始。 我已经尝试了一些与GCD有关的事情: – (MKOverlayView*)mapView:(MKMapView*)mapView viewForOverlay:(id)overlay { __block MKPolylineView* polyLineView; //do the heavy lifting (I presume this is the heavy lifting part, but // because this code doesn't compile, I can't actually *test* it) // on a background thread dispatch_async(backgroundQueue, ^ { polyLineView = [[[MKPolylineView alloc] initWithPolyline:overlay] autorelease]; [polyLineView setLineWidth:11.0]; //if the title is […]

这是比较两个GCD队列的正确方法吗?

在SO之前的一个问题之后,我现在正在比较两个不同的macros中央调度队列来试图确定当前的代码是否在主线程上运行。 我的问题只是:这是实现这一目标的有效方法吗? 还是有没有这样做,我没有考虑一些陷阱? if (dispatch_get_current_queue() != dispatch_get_main_queue()) { // We are currently on a background queue } else { // We are on the main queue } 干杯

通过GCD延迟睡眠()

每次我打电话时,我都有需要延迟5秒的方法。 首先我要sleep(5); – 它运作良好,但我相信 – 这不是客观的方式,所以我试图用GCD的帮助来写它。 这个程序的第一个呼叫延迟约5秒,但这个队列中的其他呼叫将一个接一个地延迟。 如何解决这个问题呢? – (void) buyItemAtUUID:(NSString*)UUID { dispatch_barrier_async(dataManagerQueue, ^{ [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES]; double delayInSeconds = 5.0; dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)); dispatch_after(popTime, dataManagerQueue, ^(void){ NSInteger path = [self indexFromObjectUUID:UUID]; if (path != NSNotFound) { NSMutableDictionary *item = [[_items objectAtIndex:path] mutableCopy]; NSNumber *value = [NSNumber numberWithFloat:[[item objectForKey:@"Quantity"] floatValue] – […]

Swift 3转换

我用swift 2.2编写了一个并发API调用的代码。 当我从swift 2.2更改为swift 3时,我正在用swift的语法来解决问题。 帮帮我 let endPoints = [.email, .others] let fetchGroup = dispatch_group_create() let queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_apply(endPoints.count, queue) { (index) in let enumType = endPoints[index] switch enumType { case .email: //Make email api call break case .others: //Make other api break default: break } } dispatch_group_notify(fetchGroup, dispatch_get_main_queue()) { if endPoints.count > […]

Swift 3:DispatchQueue.main.async {}和DispatcQueue.main.async之间的区别(execute:{})?

两者之间的语义差异很窄,我发现自己想知道为什么两种select都存在。 他们在function上有什么不同,或者只是一个别名?

当方法重新运行时,在方法中使用dispatch_after循环会导致多个同时发送

我正在创build一个简单的游戏。 我有以下代码: – (void)doStuff { double delayInSeconds = [NSNumber randomFloatBetweenLowerBound:0.8f upperBound:2.6f]; // Own category on NSNumber returns random float. dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)); dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ // // Do stuff // if ([self shouldDoMoreStuff]) { [self doStuff]; } }); } 这个方法是在viewDidLoad运行的,但是也会在玩家死亡的时候运行(按'Try Again'后)。 经过几次死亡,最终有许多迭代的方法同时运行,而不仅仅是一个。 我不太了解GCD和NSOperation等,但是我敢肯定我应该使用一些东西来控制这个 – 也许NSOperation – 所以在viewDidLoad中运行,然后当玩家死亡时,我取消操作,然后重新启动它。 正如我所说,我不太了解NSOperation所以我不知道它是否是:a)我应该使用什么和b)我应该如何使用它。 任何人都可以提供一些想法如何实现这一目标? 一如既往的感谢。