Tag: grand central dispatch

使用Grand Central Dispatch,如何检查是否有块正在运行?

我使用GCD从互联网做一些背景加载。 这个工程很好,除了一点缺陷。 在我的应用程序中,我有3个选项卡,当点击任何选项卡时,GCD开始为适当的选项卡执行后台加载。 如果用户决定从第一个标签页到第二个标签页(当GCD开始下载第一个标签页的数据时),然后再次返回到第一个标签页。 GCD将启动另一个后台线程(即使第一个后台线程尚未完成下载数据)。 那么有没有办法来检查后台线程当前是否正在运行? 因此,如果用户select快速切换标签(由于某种原因),它不会启动多个后台线程。

dataWithContentsOfURL,线程,与dataTaskWithURL – 有什么区别?

我们正在使用dataWithContentsOfURL,因为它,呃,简单… NSData *datRaw = [NSData dataWithContentsOfURL:ur]; 现在,当然,这将挂起主要的UI线程。 所以我们把它放在另一个线程。 我们这样做, -(void)performSearch:(NSString *)stuff then:(void(^)(void))after { dispatch_queue_t otherThread =dispatch_queue_create(nil,0); dispatch_queue_t mainThread =dispatch_get_main_queue(); dispatch_async(otherThread, ^{ self.resultsRA = [self … calls dataWithContentsOfURL …]; dispatch_async(mainThread, ^{ if (after) after(); }); }); } (顺便说一句,这是一个很好的介绍,如果需要https://stackoverflow.com/a/7291056/294884 ) 那么现在,苹果说,你不应该使用 dataWithContentsOfURL,他们说你应该改为使用NSSession ..所以, dataTaskWithURL:completionHandler: 我的问题, 是否有任何不同之处 ,使自己的线程(即dataWithContentsOfURL)与使用dataTask? 我们错误地使用 dataWithContentsOfURL:在一个线程,出于某种原因? PS我很欣赏这是更方便等我的意思是有真正的区别,任何危险,等谢谢!

如何从iOS的Grand Central Dispatch Queueasynchronous绘制到GLKit的OpenGL ES上下文

我正在尝试将冗长的OpenGL绘制操作移动到GCD队列中,以便在GPU磨合时完成其他工作。 我宁愿用GCD来做这件​​事,而不是把真正的线程join到我的应用程序中。 从字面上来说,我想要做的就是能够 不要在glDrawArrays()调用上阻塞,所以当GL渲染速度非常慢时,其余的UI可以保持响应。 当我们还没有完成glDrawArrays()调用时,请放弃glDrawArrays()调用(不要build立一个刚刚增长和增长的帧队列) 在苹果的网站上,文档说: GCD和NSOperationQueue对象可以在他们select的线程上执行你的任务。 他们可能会专门为这个任务创build一个线程,或者他们可能会重用一个现有的线程。 但无论哪种情况,都不能保证哪个线程执行任务。 对于OpenGL ES应用程序,这意味着: 在执行任何OpenGL ES命令之前,每个任务都必须设置上下文。 访问相同上下文的两个任务可能永远不会同时执行。 每个任务都应该在退出之前清除线程的上下文。 听起来很直接。 为了简单起见,我将从“OpenGL ES”游戏“新build项目”对话框中提供的新版苹果模板开始。 当你实例化它,编译并运行时,你应该看到两个立方体在灰色区域上旋转。 为了这个代码,我添加了一个GCD队列。 从ViewController.m的界面部分开始: dispatch_queue_t openGLESDrawQueue; 然后在ViewController设置viewDidLoad : openGLESDrawQueue = dispatch_queue_create("GLDRAWINGQUEUE", NULL); 最后,我对CADisplayLink最终触发的drawInRect方法进行了非常小的修改: – (void)glkView:(GLKView *)view drawInRect:(CGRect)rect { void (^glDrawBlock)(void) = ^{ [EAGLContext setCurrentContext:self.context]; glClearColor(0.65f, 0.65f, 0.65f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glBindVertexArrayOES(_vertexArray); // Render the object with GLKit […]

如何将dispatch_data_t转换为NSData?

这是正确的吗? // convert const void *buffer = NULL; size_t size = 0; dispatch_data_t new_data_file = dispatch_data_create_map(data, &buffer, &size); if(new_data_file){ /* to avoid warning really – since dispatch_data_create_map demands we care about the return arg */} NSData *nsdata = [[NSData alloc] initWithBytes:buffer length:size]; // use the nsdata… code removed for general purpose // clean up [nsdata […]

如何在Grand Central Dispatch中创build一个死锁?

在苹果文档中,它说: 重要提示:您不应该从正在计划传递给该函数的同一队列中执行的任务调用dispatch_sync或dispatch_sync_f函数。 这对保证死锁的串行队列尤为重要,但对于并发队列也应该避免。 你如何编写代码来做到这一点?

暂停计时器上的dispatch_source_cancel会导致EXC_BAD_INSTRUCTION

我试图取消,然后释放暂停的计时器,但是当我调用“dispatch_release”,我立即得到EXC_BAD_INSTRUCTION。 这是不是一个有效的计时器行动? 计时器创build和暂停: @interface SomeClass: NSObject { } @property (nonatomic, assign) dispatch_source_t timer; @end // Class implementation @implementation SomeClass @synthesize timer = _timer; – (void)startTimer { dispatch_queue_t globalQ = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); self.timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, globalQ); dispatch_time_t startWhen = dispatch_walltime(DISPATCH_TIME_NOW, NSEC_PER_SEC * 1); dispatch_source_set_timer(_timer, startWhen, 1 * NSEC_PER_SEC, 5000ull); dispatch_source_set_event_handler(_timer, ^{ // Perform a […]

在iOS中使用NSURLConnection按顺序下载文件

我想按顺序下载3个文件。 其中两个是txt文件,一个是.gz文件。 我正在使用NSURLConnection来下载上述文件。 我对iOS编程非常陌生。 我在SO和google的其他问题中已经看到,我们可以使用串行调度队列来进行一些串行操作。 但我不知道如何用NSURLConnection来做到这一点。 我在下面尝试,但没有工作。 dispatch_queue_t serialQueue = dispatch_queue_create("com.clc.PropQueue", DISPATCH_QUEUE_SERIAL); dispatch_async(serialQueue, ^{ [self downloadProp]; }); dispatch_async(serialQueue, ^{ [self downloadDatabase]; }); dispatch_async(serialQueue, ^{ [self downloadTxt]; }); 上面的代码不执行NSURLCOnnection的connectionDidFinishLoading。 任何人有想法如何实现这一目标?

iOS 3.x中GCD串行调度队列的等价物

苹果的Grand Central Dispatch(GCD)非常棒,但只适用于iOS 4.0或更高版本。 苹果公司的文档说:“串行化操作队列不能提供与Grand Central Dispatch中的串行调度队列完全相同的行为(因为队列不是FIFO,而是由相关性和优先级决定)。 在GCD发布之前支持操作系统版本的同时,达到GCD串行调度队列的正确方法是什么? 或者换一种说法,在想要支持小于4.0版本的iOS应用程序中处理简单后台处理(执行Web服务请求等)的推荐方式是什么?

图像下载后更新单元格高度

我在UITableView显示一些文本和图像。 图片首先被下载。 由于在下载图像之前,我不知道图像的大小,所以我最初把一些固定大小的UIImageView 。 当图像下载时,我调整了UIImageView大小。 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ // Download image dispatch_async(dispatch_get_main_queue(), ^{ // UIImageView resizing }); }); 所有这一切发生在cellForRowAtIndexPath 。 我在这里面临的问题是: 1.如何更新单元格的高度? 考虑到在一个单元中可以有许多图像。 所以我需要在一次下载时改变底部图像的位置。 2.我尝试使用UITableView beginUpdates和endUpdates ,但是滚动到单元格的顶部,给用户带来不好的体验。 这是UI在reloadData上的样子。 有5个图像被下载: UITableView reloadData后的UI体验

获取当前的调度队列?

我有一个应该支持从任何队列中调用的方法,并且应该期望。 它在后台线程本身中运行一些代码,然后在返回值为block参数时使用dispatch_get_main_queue。 如果不是当它进入方法时,我不希望它强制进入主队列。 有没有办法获得一个指向当前调度队列的指针?