任何方式使dispatch_queue_t单线程工作?

这是我的代码:

@interface MyObject () @property(nonatomic) dispatch_queue_t queue; @end @implementation MyObject { NSThread *_check; } - (id)init { self = [super init]; if (self) { _queue = dispatch_queue_create("com.Thread.queue", NULL); dispatch_async(_queue, ^{ _check = [NSThread currentThread]; //for ex. thread number = 3 //some code here... }); } return self; } - (void)someMethod:(MyObjClass *)obj { dispatch_async(_queue, ^{ //need th if (_check != [NSThread currentThread]) { // it is sometimes number 3, but sometimes it changes NSLog(@"Thread changed."); } [obj doSmth]; //got crash if currentThread != _check }); } @end 

我需要确保所有MyObjClass的方法在同一个线程中执行。 但是这个代码通过它自己的意愿改变了线程,但有时它在单线程中工作。 任何方式我可以强迫它一直使用相同的线程?

总之,没有。 除主队列之外,GCD没有任何线程关联的概念。 如果你真的需要线程亲和力,GCD并不是真正的工具。 如果你喜欢这个成语,并且想要适应你的需求,你可以这样做:

 @implementation AppDelegate { NSThread* thread; } void dispatch_thread_async(NSThread* thread, dispatch_block_t block) { if ([NSThread currentThread] == thread) { block(); } else { block = [block copy]; [(id)block performSelector: @selector(invoke) onThread: thread withObject: nil waitUntilDone: NO]; } } void dispatch_thread_sync(NSThread* thread, dispatch_block_t block) { if ([NSThread currentThread] == thread) { block(); } else { [(id)block performSelector: @selector(invoke) onThread: thread withObject: nil waitUntilDone: YES]; } } - (void)applicationDidFinishLaunching:(NSNotification *)aNotification { // Insert code here to initialize your application thread = [[NSThread alloc] initWithTarget: self selector:@selector(threadMain) object:nil]; [thread start]; dispatch_thread_async(thread, ^{ NSLog(@"Async Thread: %@", [NSThread currentThread]); }); dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ dispatch_thread_sync(thread, ^{ NSLog(@"Sync Thread: %@", [NSThread currentThread]); }); }); } - (void)threadMain { // You need the NSPort here because a runloop with no sources or ports registered with it // will simply exit immediately instead of running forever. NSPort* keepAlive = [NSPort port]; NSRunLoop* rl = [NSRunLoop currentRunLoop]; [keepAlive scheduleInRunLoop: rl forMode: NSRunLoopCommonModes]; [rl run]; } @end 

如果你有你的类的多个实例,你用每个新的init覆盖你的队列。

单身人士或静态可以用来解决这个问题。