0

私はいくつかの UIView を作成し、当面の質問にとってそれほど重要ではない理由でそれらをキャッシュしています。

ビュー X をサブビューとして Y に追加した後、X のサブビューの 1 つが表示されません。20~30秒待てば突然出てきます。

ビューを作成してキャッシュに追加する方法は次のとおりです。これらのビューはまだ UI に追加されていません。これは後で行われます。

dispatch_async(dispatch_get_global_queue(0, 0), ^{

        for(int i = 0; i < 10;i++){
            MyUIView *cTemp = [[MyUIView alloc] initWithFrame:CGRectZero];
            [self addViewToCahce:cTemp forKey:@"key"];  

        }

});

しかし、削除すると、本来のdispatch_asyncように表示されます。ここで何が起こっているのか、またはこの異常な動作を防ぐ方法を知っている人はいますか?

4

1 に答える 1

2

メイン スレッド以外で UI を変更しないでください。ほとんどの UI フレームワークと同様、Cocoa はマルチスレッドではありません。代わりに次のことを試してください。

dispatch_async(dispatch_get_global_queue(0, 0), ^{
    // Do whatever processing you want to do here
    dispatch_async(dispatch_get_main_queue(), ^{
        for(int i = 0; i < 10;i++){
            MyUIView *cTemp = [[MyUIView alloc] initWithFrame:CGRectZero];
            [self addViewToCahce:cTemp forKey:@"key"];  

        }
    });    
});

あなたが説明した行動を経験する理由については、私は推測することしかできません. UIViewコンストラクターがスレッドセーフであるとは信じていません。別のスレッドでビューを作成する必要がある場合は、可能であればコードを少しリファクタリングすることをお勧めします。

于 2012-09-20T17:16:17.983 に答える