1

関数呼び出し[self updateUI];のようです。booによってブロックされました。

booは別のバックグラウンド スレッドで実行されますか、それとも以下のコードのfooと同じですか?

[自己更新UI]はどのようにできますか; ブーでブロックしませんか?

- (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 は、NEW スレッドでセレクターを実行します。アップルのドキュメントから:

このメソッドは、アプリケーションに新しいスレッドを作成し、アプリケーションがまだマルチスレッド モードになっていない場合は、それをマルチスレッド モードにします。aSelector によって表されるメソッドは、プログラム内の他の新しいスレッドの場合と同様に、スレッド環境を設定する必要があります。

両方の関数を同じバックグラウンド スレッドで実行する場合は、バックグラウンド スレッド (キューとも呼ばれます) をクラスのプライベート メンバーとして宣言し (両方の関数からアクセスできるようにします)、セレクターを実行する必要があります。そのキュー

于 2014-05-26T10:27:01.333 に答える