1

似乎该函数调用[self updateUI]; 嘘声阻止。

boo是在另一个后台线程中运行还是与下面的代码中的foo相同?

[self updateUI]怎么可以;不被嘘?

- (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;
}
4

2 回答 2

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];
}
于 2014-05-26T10:26:36.013 回答
0

performSelectorInBackground 在新线程上执行选择器。来自苹果文档

此方法在您的应用程序中创建一个新线程,如果尚未将您的应用程序置于多线程模式下。由 aSelector 表示的方法必须像设置程序中的任何其他新线程一样设置线程环境。

如果您想在相同的后台线程上执行这两个函数,则必须将后台线程(也称为队列)声明为类的私有成员(因此可以从两个函数访问它)并在那个队列

于 2014-05-26T10:27:01.333 回答