`[NSThread isMainThread]` always returns YES

别来无恙 提交于 2019-12-17 20:18:30

问题


This code

dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
      NSLog(@"Main Thread? %d", [NSThread isMainThread]);
});

shows that I'm in the main thread. Even doing this:

queue = dispatch_queue_create("nonMainQueue", NULL);

still reports that I'm in the main queue. This is, it seems, because I'm using dispatch sync.

Does this mean that my code is the same as not using dispatch_sync at all? Also: what's the point of dispatch_sync if it does nothing at all, then?


回答1:


Because queues are not threads, in order to check if you are on the main 'queue', you must use different code, something similar to this:

if (dispatch_get_current_queue() == dispatch_get_main_queue()) {
   NSLog(@"On Main Thread!");
}

Just note that dispatch_get_current_queue is deprecated, and is subject to be completely removed in a later iOS/Mac OS version.




回答2:


This is documented behavior. As an optimization the blocks passed to dispatch_sync are executed on the current thread if possible (which is almost always).




回答3:


My understanding from Apple's GCD guide, there is no guarantee that dispatch queues will execute on a separate thread. GCD will determine which thread, and if necessary create a new one.

Part of the point is now you do not have to think about threads.

The only thing to keep in mind, is to make sure you are updating UI elements on the main queue, for example:

// on background queue
dispatch_async( dispatch_get_main_queue(), ^(void){
    someLabel.text = @"My Text";
});


来源:https://stackoverflow.com/questions/14716334/nsthread-ismainthread-always-returns-yes

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!