创建具有相同名称的串行队列的2个对象共享同一队列

Avn*_*arr 21 objective-c grand-central-dispatch ios

对行为不确定,因为我怀疑我遇到了僵局,

我有一个包含多个对象的类 - 每个对象创建一个具有相同名称的队列.我不确定GCD是否在对象之间重用相同的队列,或者它们是否只是共享相同的名称.

例如

@interface MyClass

-(void)doSomeWork
@property (nonatomic,strong) dispatch_queue_t myQueue;

@end

@implementation MyClass

-(id)init
{
  self = [super init];
  self.myQueue = dispatch_queue_create("MyQueue",DISPATCH_QUEUE_SERIAL);
  return self;
}

-(void)doSomeWork
{
  dispatch_async(self.myQueue,^{
    // some long running work
  });
}

@end


@interface SomeClassWhichCreatesALotOfObjects

@end


@implementation SomeClassWhichCreatesALotOfObjects

-(void)someMethod
{
  for(int i = 0; i < 10000; i++)
  {
    MyClass *object = [MyClass new];
    [object doSomeWork]; // are these running in serial to each other or are each offset to the queue their object has created? Can't understand from the debugger
  }
}
@end
Run Code Online (Sandbox Code Playgroud)

Guy*_*gus 34

正如Apple的文档所述,标签是:

一个字符串标签,用于附加到队列中,以便在诸如Instruments之类的调试工具中唯一地标识它...

它被用作提示,仅此而已.

编辑

这是您想要使用共享队列的代码.

+ (dispatch_queue_t)sharedQueue
{
    static dispatch_queue_t sharedQueue;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedQueue = dispatch_queue_create("MyQueue", NULL);
    });
    return sharedQueue;
}
Run Code Online (Sandbox Code Playgroud)


mic*_*tox 11

dispatch_queue_create正如名称所暗示的那样,它会创建一个调度队列.您提供的标签不需要是唯一的,它仅用于调试目的.