2012-08-09 206 views
2

使用我使用这个代码:哪个队列GCD

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul); 

dispatch_async(queue, ^{ 

//saving stuff to NSUserDefaults 

}); 

它的工作原理,只要在快速连续的代码不叫两次,在这一点上,我得到一个崩溃。所有它说的是Thread 7: trace的崩溃,在屏幕上为CFRetain

我猜我的队列不应该允许重新启动这个例程,除非它已经完成。但我不确定要改变的参数中的哪一个。我不需要它是高优先级的,我也不确定它是否需要成为全局队列,说实话,线程编程需要一些时间让我指出所有这些,所以我希望有人能指出我在正确的方向。

+0

只是猜测,尝试调用不同的队列类型。 – Dustin 2012-08-09 13:35:29

回答

2

如果您希望此操作在同一个队列异步但始终运行(意思是:这是一个在后台完成,但从来没有两次在同一时间),我建议你创建你的类dispatch_queue_t(或地方访问全球 ,外法):

这会是这样的:

@interface Foo : Bar { 

    @private 
    dispatch_queue_t _savingQueue = dispatch_queue_create("savingQueue", NULL); 

} 

-(void)saveStuff; 

@end 

,并始终保存在该队列

-(void)saveStuff{ 

    dispatch_async(_savingQueue, ^{ 

    //saving stuff to NSUserDefaults 

    }); 

} 
+0

这是有道理的,只是你的'dispatch_queue_create'应该指定它是一个串行队列,如果你不想同时运行两次任务,对吧?你已经通过'NULL',这不是我认为的最佳选择。 – johnbakers 2012-08-11 04:32:44

+0

我现在看到NULL的结果是默认的,这确实是串行的。非常感谢。 – johnbakers 2012-08-11 04:33:42

3

全局队列为固有并发。当你对这些队列使用dispatch_sync()时,它仅仅意味着该功能将在块完成执行时返回。它确实而不是保证该队列上的块不会同时运行。

创建串行队列(带有串行选项的dispatch_queue_create())并将块分派到其上。注意不要将disptch_sync()从运行在该队列中的块放到队列中;僵局随之而来。

+0

关于线程编程的各种Apple文档,您认为最好的读法是什么或其他资源? – johnbakers 2012-08-10 14:35:00

+0

我会从这里开始http://developer.apple.com/library/ios/#documentation/General/Conceptual/ConcurrencyProgrammingGuide/Introduction/Introduction.html然后分支出技术特定的注释或指南。 – bbum 2012-08-11 03:18:07