代码之家  ›  专栏  ›  技术社区  ›  johnbakers

在GCD中使用哪个队列

  •  2
  • johnbakers  · 技术社区  · 13 年前

    我正在使用以下代码:

    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 回复  |  直到 13 年前
        1
  •  3
  •   bbum    13 年前

    全局队列是 固有并发的 .当你 dispatch_sync() 对于这些队列,这仅仅意味着当块执行完毕时,函数将返回。确实如此 保证该队列上的块不会同时运行。

    创建串行队列( dispatch_queue_create() 使用串行选项),并将您的块发送到它上 disptch_sync() 从在该队列中运行的块到该队列上;僵局随之而来。

        2
  •  2
  •   Olotiar    13 年前

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