似乎函数调用 [self updateUI]; 被 boo 阻止。
boo 在另一个后台线程中运行,或者与 foo 一样运行,如下面的代码?
[self updateUI]; 怎么能不被boo阻止?
- (void)MainFunction
{
[self performSelectorInBackground@selector(foo) withObject:nil];
}
- (void)foo
{
[self performSelectorInBackground@selector(boo) withObject:nil];
//updaate UI in MainThread
[self updateUI];
}
- (void)boo
{
//function here take long time to run;
}
答案 0 :(得分:3)
在您的代码中似乎您在后台调用foo ,因此 UI在后台线程中更新,这是不可能的,因为您需要在主线程中执行此操作。在任何情况下,performSelectorInBackground
都有点旧......以这种方式使用dispatcher
:
- (void)MainFunction
{
[self foo];
}
- (void)foo
{
dispatch_async(dispatch_get_global_queue(DISPATCH_PRIORITY_DEFAUL, 0ull), ^{
[self boo];
dispatch_async(dispatch_get_main_queue(), ^{
//updaate UI in MainThread
[self updateUI];
};
};
}
- (void)boo
{
//function here take long time to run;
}
在这种情况下 updateUI 等待 boo ,但如果您之前想要 updateUI ,那么 boo 完成:
- (void)foo
{
dispatch_async(dispatch_get_global_queue(DISPATCH_PRIORITY_DEFAUL, 0ull), ^{
[self boo];
};
[self updateUI];
}
答案 1 :(得分:0)
performSelectorInBackground在NEW线程上执行选择器。来自Apple docs:
此方法在您的应用程序中创建一个新线程,将您的 应用程序进入多线程模式(如果尚未应用)。方法 由aSelector表示必须设置线程环境 你会为你的程序中的任何其他新线程。
如果要在SAME后台线程上执行这两个函数,则必须将后台线程(也称为队列)声明为类的私有成员(因此可以从两个函数访问它)并在该队列上执行选择器