在GCD中使用哪个队列

时间:2012-08-09 11:38:06

标签: objective-c

我正在使用此代码:

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);

dispatch_async(queue, ^{

//saving stuff to NSUserDefaults

});

只要代码没有快速连续调用两次就可以工作,此时我就崩溃了。在Thread 7: trace的屏幕中,它只是CFRetain表示崩溃。

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

2 个答案:

答案 0 :(得分:3)

全局队列固有并发。当你dispatch_sync()到这些队列时,它只意味着当块完成执行时函数将返回。它保证该队列上的块不会同时运行。

使用serial选项创建串行队列(dispatch_queue_create())并将块分派到它上面。注意不要从该队列中运行的块中disptch_sync()到队列中;死锁随之而来。

答案 1 :(得分: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

    });

}