iOS:后台线程/多线程?

iOS: Background Threads / Multithreading?

如果从后台线程上 运行ning 的方法调用第二个方法,第二个方法是在同一线程中自动 运行 还是发生在主线程上?

注意:我希望在后台处理我的第二种方法,但由于我更新了其中的 UI,执行以下操作是正确的方法:

- (void)firstMethod {

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{

        //Do stuff in background
        ...

        //Call a second method (Assume it'll run in this background thread as well)
        [self secondMethod];
    });
}

//Second Method

- (void)secondMethod {

    //Do heavy lifting here
    ...

    dispatch_async(dispatch_get_main_queue(), ^{

        //Update UI here
        ...

    });
}

更新

哦,我完全忘了提到这种方法是将建议加载到视图中的方法(想想键盘建议)。由于每次按键都会调用此方法,因此我只希望它在用户完成输入时为 运行。我接近它的方式是通过在按键之间设置 0.2 的延迟,如果新的按键点击落在 0.2 的延迟范围内,它会取消以前的方法调用,并启动一个新的调用(这样,假设用户键入单词,"the",它没有 运行 "t"、"th"、"the" 的建议。由于用户打字速度很快,我们可以假设他们不需要建议对于任何事情,直到他们停止输入(允许呼叫在 0.2 秒延迟后通过),或者如果他们输入缓慢(他们可能正在寻找建议)。

因此,在调用我的 secondMethod 时,我会执行以下操作:

[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(secondMethod) object:nil];
[self performSelector:@selector(secondMethod) withObject:nil afterDelay:0.2];

问题是它没有被调用(我假设这个方法默认它在主线程中执行?)

一般来说,如果不明确说明,就不会在线程之间跳转。当然,像调用方法这样微不足道的事情并非如此。你的代码看起来不错。请记住不要一次从多个队列访问可变状态(例如,如果繁重的工作使用实例变量,请确保 -firstMethod 不会连续调用两次。它会产生对 -secondMethod 的两次异步调用然后,他们会遍历彼此的数据。如果这是一个问题,请创建一个串行调度队列而不是使用全局调度队列)。