Tag: grand central dispatch

GCD创build的线程数量?

GCD创build了多less个线程有没有很好的文档? 在WWDC上,他们告诉我们这是围绕CPU核心build模的。 但是,如果我称这个例子: for (int i=1; i<30000; i++) { dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ [NSThread sleepForTimeInterval:100000]; }); } 它打开了66个线程,即使在iPad1上也是如此。 (它本身也在Lion上调用时打开66个线程)。 为什么66?

大中央调度与NSThread

我为NSThread和Grand Central Dispatch(GCD)创build了一些testing代码: – (void)doIt:(NSNumber *)i { sleep(1); NSLog(@"Thread#%i", [i intValue]); } – (IBAction)doWork:(id)sender { for (int i = 0; 10 > i; i++) { NSNumber *t = [NSNumber numberWithInt:i]; [NSThread detachNewThreadSelector:@selector(doIt:) toTarget:self withObject:t]; } sleep(1); dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_apply(10, queue, ^(size_t i) { sleep(1); NSLog(@"GCD#%u",(int)i); }); } 结果是: 2011-04-13 19:41:07.806 GDC[1494:5e03] Thread#0 […]

“总是返回YES

这个代码 dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ NSLog(@"Main Thread? %d", [NSThread isMainThread]); }); 表明我在主线程中。 即使这样做: queue = dispatch_queue_create("nonMainQueue", NULL); 仍然报告我在主队列。 这似乎是因为我在使用dispatch sync 。 这是否意味着我的代码与根本不使用dispatch_sync相同? 另外:如果dispatch_sync什么也没有做,那么是什么意思?

Grand Central Dispatchasynchronous与同步

我正在阅读有关GCD调度队列的文档,他们说队列是FIFO,所以我正在弄乱这对asynchronous/同步调度有什么影响? 从我的理解asynchronous执行的东西,它获取的东西,而同步执行的东西串行.. 但是当你编写你的GCD代码时,你决定事情发生的顺序。所以只要你知道你的代码中发生了什么,你应该知道事情的执行顺序。 我的问题是,在这里async的好处吗? 我在理解这两件事情的时候错过了一些东西。

GCD – 用于更新UIImageView的主要vs后台线程

我是GCD的新手,并且正在放松自己。 背景:我正在使用ALAssetsLibrary为UIScrollView执行延迟加载例程。 当我的UIScrollView加载时,我使用aspectRatioThumbnails的aspectRatioThumbnails填充它,然后当用户滚动时,我调用下面的例程来加载当前正在显示的ALAsset的fullScreenImage 。 这似乎工作。 (如果有人有一个更好的延迟加载例程,请发表评论,我已经看了所有我能find的,加上WWDCvideo,但他们似乎处理更多的瓷砖或比我需要更复杂) 我的问题:我使用后台线程来处理加载fullScreenImage ,当完成后,我使用主线程将其应用到UIImageView。 我是否需要使用主线程? 我已经看到所有UIKit更新需要在主线程上发生,但我不确定是否适用于UIImageView。 我以为是这样,因为它是一个屏幕元素,但后来我意识到,我根本不知道。 – (void)loadFullSizeImageByIndex:(int)index { int arrayIndex = index; int tagNumber = index+1; ALAsset *asset = [self.assetsArray objectAtIndex:arrayIndex]; __weak typeof(self) weakSelf = self; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ UIImage *tmpImage = [[UIImage alloc] initWithCGImage:asset.defaultRepresentation.fullScreenImage]; if ([weakSelf.scrollView viewWithTag:tagNumber] != nil){ dispatch_async(dispatch_get_main_queue(), ^{ if ([weakSelf.scrollView viewWithTag:tagNumber]!= nil){ UIImageView * tmpImageView […]

在CTCallCenter callEventHandler中取消隐藏视图非常缓慢

在原始问题没有得到答复之后,转载更加简洁和重点突出的问题。 经过一天的研究之后,还要加深对这个问题的认识: 在我的应用程序委托(didFinishLaunching)中,我在CTCallCenter上设置了一个callEventHandler。 这个想法是,当一个callState改变时,我发布一个包含call.callState的userInfo字典的通知。 在我看来,我观察到这个通知,并且当userInfo字典包含CTCallDisconnected的值时,我想取消隐藏一个视图。 我遇到的问题是,无隐藏的方面几乎一致,约7秒。 其他一切工作正常,我知道这是因为我NSLog之前和之后的解除隐藏,而这些日志立即出现,但恶意的观点仍然滞后7秒。 这是我的代码: appDidFinishLaunching: self.callCenter = [[CTCallCenter alloc] init]; self.callCenter.callEventHandler = ^(CTCall * call){ //我们的呼叫中心发生了状态变化 NSDictionary * dict = [NSDictionary dictionaryWithObject:call.callState forKey:@“callState”]; [[NSNotificationCenter defaultCenter] postNotificationName:@“CTCallStateDidChange”object:self userInfo:dict]; }; 然后,当用户点击拨打电话号码的button时,我会收听此通知: [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(ctCallStateDidChange 🙂 name:@“CTCallStateDidChange”object:nil]; 然后,在ctCallStateDidChange中: – (void)ctCallStateDidChange:(NSNotification *)通知 { 的NSLog(@ “121”); NSString * callInfo = [[通知用户信息] objectForKey:@“callState”]; 如果([callInfo isEqualToString:CTCallStateDisconnected]){ NSLog(@“before […]

用GCD运行重复NSTimer?

我想知道为什么当你在GCD块中创build一个重复定时器时,它不工作? 这工作正常: -(void)viewDidLoad{ [super viewDidLoad]; [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(runTimer) userInfo:nil repeats:YES]; } -(void)runTimer{ NSLog(@"hi"); } 但是这个工作: dispatch_queue_t myQueue; -(void)viewDidLoad{ [super viewDidLoad]; myQueue = dispatch_queue_create("someDescription", NULL); dispatch_async(myQueue, ^{ [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(runTimer) userInfo:nil repeats:YES]; }); } -(void)runTimer{ NSLog(@"hi"); }

performSelector:withObject:afterDelay:和dispatch_after之间的折衷是什么?

我遇到的唯一的function差异是,我可以取消与performSelector:withObject:afterDelay: 我不知道如何取消提交给dispatch_after的块。 (请让我知道是否有办法做到这一点,我不知道)。 我想知道更多关于: function的权衡(还有什么可以用一个接口而不是其他的?) 性能权衡(一个实现更有效率?在哪些情况下?) 风格权衡(我应该更喜欢一个接口的某些任务,以更好地遵循常见的风格或惯例?)

在Grand Central Dispatch中使用串行队列的dispatch_async与dispatch_sync

好的,我喜欢Grand Central Dispatch,使用之后相对成功,但这是我不完全了解的。 假设我已经创build了我自己的串行队列 dispatch_queue_t myQueue; myQueue = dispatch_queue_create("myQueue", NULL); 之后,我这样做: dispatch_async(myQueue, ^{ [self doStuff1]; }); // and a few lines later… dispatch_sync(myQueue, ^{ [self doStuff2]; }); 第一次调度是asynchronous的。 所以,这将同时完成,对吧? 那么如果myQueue是连续的呢? 一个串行队列如何并行地执行或者如果你会不按顺序执行? 谢谢

哪些任务比GCD更适合NSOperation?

哪些任务会更适合使用NSOperation而不是使用GCD进行iPhone编程? 对我来说,他们似乎也是这样做的。 我看不出其中的优点和缺点。