iOS performSelectorInBackground里面的performSelectorInBackground

时间:2014-05-26 10:22:07

标签: ios multithreading blocking background-thread

似乎函数调用 [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;
}

2 个答案:

答案 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后台线程上执行这两个函数,则必须将后台线程(也称为队列)声明为类的私有成员(因此可以从两个函数访问它)并在该队列上执行选择器