2

我正在使用这段代码:

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);

dispatch_async(queue, ^{

//saving stuff to NSUserDefaults

});

只要代码没有被快速连续调用两次,它就可以工作,此时我会崩溃。它所说的只是Thread 7: trace崩溃,在一个屏幕上CFRetain

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

4

2 回答 2

3

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

创建串行队列(dispatch_queue_create()使用串行选项)并将您的块分派到它上面。注意不要disptch_sync()从该队列中运行的块进入队列;出现僵局。

于 2012-08-09T13:41:22.953 回答
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

    });

}
于 2012-08-09T14:32:06.423 回答