1

アプリのインターフェイスに約 10 個のオブジェクトがあります。これらのオブジェクトは基本的に、特定の時間にどのボタンがアクティブであるかを示すグローを持つボタンです。ボタンが選択されると、そのグローがオンになり、他のすべてのボタンのグローがオフになります。

グローのオンとオフを切り替えるために、私はこれを持っていました

[buttons enumerateObjectsWithOptions:NSEnumerationConcurrent
                                     usingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    if (obj == sender)
            [(myButtonClass *)obj showGlow];
    else {
            [(myButtonClass *)obj hideGlow];
    }
}];

しかし、私はこれに変更することを余儀なくされました

[buttons enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {

    if (obj == sender)
            [(myButtonClass *)obj showGlow];
    else {
            [(myButtonClass *)obj hideGlow];
    }
}];

列挙の同時部分を削除します。問題は、特に一部のボタンで、グローがオンまたはオフに切り替わるのに 5 秒かかっていましたが、常に同じボタンの場合だけでした。順番に処理されているようなキューに入っているような印象でした(?????!!!)

showGlow/hideGlow メソッドは基本的に 2 行で構成されています。変数の設定と、グロー imageView の隠しプロパティのオンとオフの設定です。したがって、これらはすべてのボタンの高速な方法です。

私が理解できないのは、一部のボタンで問題が発生し、他のボタンでは発生しなかった理由と、アプリが基本的にアイドル状態のときにブロックの処理に時間がかかる理由です。

手がかりはありますか?ありがとう。

4

1 に答える 1

5

UI の更新が「遅い」理由の 1 つは、このNSEnumerationConcurrentオプションを使用すると、メイン スレッド以外のスレッドで列挙が行われることが考えられます。すべての UI の更新はメイン スレッドで行われる必要があるため、UI の変更はすぐには反映されませんが、代わりに、実行ループが行われたすべての変更をフラッシュするときに遅延が発生します。

あなたの場合、オブジェクトは 10 個しかないため、同時オプションを使用することは正当化されません。さらに、読みやすいものを使用できるのに、ブロックを使用してコードを複雑にする理由はありません。

for (UIButton *button in buttons) {
    if (button == sender) [button showGlow];
    else [button hideGlow];
}

アクティビティ インジケーターをどこかで開始し、バックグラウンド スレッドで停止すると、同じ UI 更新の遅延を実験して確認できます。実際に停止するまで数秒かかります。

ブロックの使用を主張する場合は、メイン スレッドですべての UIKit メソッドを呼び出す必要があります。

[buttons enumerateObjectsWithOptions:NSEnumerationConcurrent
                                 usingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    if (obj == sender)
        // One possibility with GCD and dispatch_async on the main queue
        dispatch_async(dispatch_queue_get_main(), ^{[(myButtonClass *)obj showGlow];});
    else {
        // another possibility to call the selector on the main thread
        [(myButtonClass *)obj performSelectorOnMainThread:@selector(hideGlow)];
    }
}];
于 2012-10-26T23:52:40.747 に答える