iOS PerformSelectorInBackground внутри PerformSelectorInBackground

Похоже, вызов функции [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;
}

person daniel    schedule 26.05.2014    source источник
comment
Сначала вызывается основная функция, затем foo и boo?   -  person nmh    schedule 26.05.2014


Ответы (2)


В вашем коде кажется, что вы вызываете foo в фоновом режиме, поэтому пользовательский интерфейс обновляется в фоновом потоке, что невозможно, потому что вам нужно сделать это в основном потоке. В любом случае, 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];
}
person Matteo Gobbi    schedule 26.05.2014

PerformSelectorInBackground выполняет селектор в НОВОМ потоке. От Apple документы:

Этот метод создает новый поток в вашем приложении, переводя ваше приложение в многопоточный режим, если это еще не было сделано. Метод, представленный aSelector, должен настроить среду потока так же, как и для любого другого нового потока в вашей программе.

Если вы хотите выполнять обе функции в ОДНОМ и ОДНОМ фоновом потоке, вам придется объявить фоновый поток (также называемый очередью) как закрытый член класса (чтобы он был доступен из обеих функций) и выполнить селектор на эта очередь

person Shai    schedule 26.05.2014