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导致默认值,这确实是串行的。非常感谢。