2011-01-21 7 views
7

目標は「テーブルビューを表示する前にデータを読み込むviewWillAppearの開始時にスピナーグラフィックを起動する」ため、ユーザーはテーブルを見る前に遅延がなぜあるのか不思議ではありません。私。 UIActivityIndi​​catorViewがウインドウに追加されました。私は、アルファを非表示にするか設定したいだけです。クラッシュ - "Collection <CALayerArray:0x645dfc0>が列挙されている間に突然変異しました。"

スレッドを開始して「回転歯車」画像ビュー(tag = 333)が表示されるようになると、この奇妙なエラーが発生してから、viewWillAppearの読み込み/

[appdel addGearz]と[appdel removeGearz]が呼び出されるたびに取得することはありませんが、これらは両方とも発生し、ランダムです。 2つのviewWillAppearsの後、または15の後に起こります。アルファを設定する行をコメントアウトすると、すべてが機能します。典型的なviewWillAppearは次のようになります

、ここ

[super viewWillappear]; 
[email protected]"Products listing"; //and other simple things 
[appdel addGearz]; 
[self getProducts]; 
[self getThumbnails]; 
[myTableView reloadData]; //in case view already loaded and coming back from subview and data changed 

とは、αを持つ行が

-(void)addGearz { 
    [NSThread detachNewThreadSelector:@selector(gearzOn) toTarget:self withObject:nil]; 
} 

-(void)removeGearz { 
    [NSThread detachNewThreadSelector:@selector(gearzOff) toTarget:self withObject:nil]; 
} 

- (void)gearzOn { 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    [window viewWithTag:333].alpha=1.0; 
     // 
     // [[window viewWithTag:333] setNeedsDisplay]; 
    [pool drain]; 
} 

- (void) gearzOff { 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    [window viewWithTag:333].alpha=0.0; 
     // 
     // [[window viewWithTag:333] setNeedsDisplay]; 
    [pool drain]; 
} 

をコメントアウトされていない、私は他の誰かのコードを使用した場合にクラッシュするコードです。なので...あなたが見ることができる明白な何か?確かに私はスレッド内のUIViewのアルファを変更できる必要がありますか?アルファチェンジを「変更している間に列挙を停止する」コードに「埋め込む」必要がありますか?

私は、そのアルファチェンジラインをプールのallocより上に移動するか、[pool drain]よりも下に移動することでクラッシュしないようにしましたが、 "プールがない状態でオートレリースされました。 。

明らかに、このスレッドコードについてはわかりません。

答えて

8

別のスレッドでUIを変更しないでください。 UIはメインスレッド上でのみ操作する必要があります。

新しいスレッドを切り離す代わりに、performSelectorOnMainThread:withObject:waitUntilDone:を使用してください。これにより、メソッドが適切なスレッドで確実に呼び出されます。

+0

[self performSelectorOnMainThread:@セレクタ(gearzOn)withObject:なしwaitUntilDone:はい];ビュー全体が読み込まれる前にviewWillAppearがすべての読み込みを行うため、ユーザーは何かが起こっていることを認識する必要があります。 –

+0

[window setNeedsDisplay]で表示されませんでした。どちらか。しかし、アルファ版のUIAnimationを使っていました。 (クイックフェード。)それはなぜ作品が、アルファを設定し、ウィンドウを更新するように頼んでいない任意のアイデア?あなたの答えが正しいとマークし、問題を解決しました。ありがとう! –

+0

私はレイヤの表示キューとアニメーションを扱う方法との関係があると思います。 UIAnimationがやったことを知ってよかったです。 –

関連する問題