Ios GCD:非主线程返回

Ios GCD:非主线程返回,ios,objective-c,multithreading,grand-central-dispatch,Ios,Objective C,Multithreading,Grand Central Dispatch,我在一些非主线程中使用dispatch\u async。我们称之为线程A。我不是通过使用GCD获得线程A的。在执行了一些块之后,我想返回线程A。我怎样才能使它运行呢 踏面A: dispatch_queue_t fetchQ = dispatch_queue_create("Thread B", NULL); dispatch_async(fetchQ, ^{ // Do some stuff... // ... //Now I want to return in Thr

我在一些非主线程中使用dispatch\u async。我们称之为线程A。我不是通过使用GCD获得线程A的。在执行了一些块之后,我想返回线程A。我怎样才能使它运行呢

踏面A:

dispatch_queue_t fetchQ = dispatch_queue_create("Thread B", NULL);
dispatch_async(fetchQ, ^{
    // Do some stuff...
    // ...

    //Now I want to return in Thread A
});
dispatch_release(fetchQ);
怎么样

dispatch_queue_t fetchA = ...
//..

dispatch_queue_t fetchQ = dispatch_queue_create("Thread B", NULL);
dispatch_async(fetchQ, ^{
    // Do some stuff...
    // ...

    dispatch_async(fetchA, ^{
        // Do stuff on Tread A
    });

});
dispatch_release(fetchQ);

这是一种丑陋的做法,但似乎有效

dispatch_queue_t fetchQ = dispatch_queue_create("Thread B", NULL);

__block BOOL changeWhenComplete = NO;

dispatch_async(fetchQ, ^{

    for (int i =0; i < 2; i++) {

        NSLog(@"doing work");
        sleep(1);
    }
    //Now I want to return in Thread A
    changeWhenComplete = YES;
});
dispatch_release(fetchQ);

while (!changeWhenComplete) {

    sleep(1);
    NSLog(@"waiting for fetchQ to complete");
}

NSLog(@"fetchQ returned");
return;

值得注意的是,这将阻止线程A。

越早区分线程和队列,情况就越好。不要因为你使用了相同的GCD队列就相信你一定会在同一个线程上运行。对不起,这真是个愚蠢的问题。谢谢@Borrdeni没有说这是一个愚蠢的问题,我只是认为在你开始考虑答案之前,你应该意识到这一区别。问题指出OP得到了第一条线索,但不确定这是否是他通过GCD以外的方法得到的。也许你可以说服他这样做,我希望,但现在这有点不中肯。