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 的两次异步调用然后,他们会遍历彼此的数据。如果这是一个问题,请创建一个串行调度队列而不是使用全局调度队列)。
如果从后台线程上 运行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 的两次异步调用然后,他们会遍历彼此的数据。如果这是一个问题,请创建一个串行调度队列而不是使用全局调度队列)。