我正在使用此代码:
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 :(得分: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
});
}