Objective c 在GCD中使用哪个队列

Objective c 在GCD中使用哪个队列,objective-c,Objective C,我正在使用以下代码: dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul); dispatch_async(queue, ^{ //saving stuff to NSUserDefaults }); 只要代码没有连续快速调用两次,它就可以工作,在这一点上我会崩溃。它所说的只是thread7:trace,在CFRetain的屏幕中跟踪崩溃 我猜我的队列不应该允许重新启动这

我正在使用以下代码:

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);

dispatch_async(queue, ^{

//saving stuff to NSUserDefaults

});
只要代码没有连续快速调用两次,它就可以工作,在这一点上我会崩溃。它所说的只是
thread7:trace
,在
CFRetain
的屏幕中跟踪崩溃

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

全局队列本质上是并发的。当您
dispatch\u sync()
到这些队列时,这仅仅意味着在执行完块后函数将返回。它不能保证该队列上的块不会同时运行


创建串行队列(
dispatch\u queue\u Create()
,使用串行选项)并将块分派到该队列上。小心不要从队列中运行的块中
将distch_sync()
发送到队列中;死锁接踵而至。

如果您希望此操作异步运行,但始终在同一队列上运行(意思是:它在后台完成,但不会同时执行两次),我建议您在类中创建一个
dispatch\u 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

    });

}

猜猜看,试着调用不同的队列类型。在线程编程的各种Apple文档中,你认为最好读什么,或者其他资源?我会从这里开始,然后扩展到特定于技术的说明或指南。这是有意义的,除非您的
调度队列\u create
应该指定它是一个串行队列,如果您不想同时运行任务两次,对吗?您已经通过了
NULL
,我认为这不是最好的选择。我现在看到NULL导致默认值,这确实是串行的。非常感谢。