2010-12-29 12 views
2

私のアプリにはメインスレッドと補助スレッドがあります。誰もが知っているメインスレッドはUIによって使用されています。私は、私のビューのバックグラウンド読み込みを行うためにセカンダリスレッドを使用します。 私はダミーコントローラと呼ばれるメインコントローラを持っています。そこから私は風景モードである私のメインコントローラに電話をかけます。セカンダリスレッドに関して

基本的には、ダミーコントローラを回転させると、メインのランドスケープコントローラをロードできるようにしたいのですが、その逆もあります。

ダミーからメインに回転するとすべてうまく動作します。 メインにはロードする一連の子コントローラがあります。そのため、そのプロセスをセカンダリスレッドに置いています。その時までにローダー画面を表示しています。

ダミーは通常のビューコントローラで、メインはモーダルビューコントローラです。

今問題です。

ユーザがdummy - > mainというフォームを回転しようとしている場合、rotateメソッドはメインビューコントローラの初期化を開始します。しかし何らかの理由で、ユーザーが心を変えてmain - > dummyという形で理想的に戻ってくると、UIスレッド(main theread)がフリーであるので、遷移はスムーズになるはずです。 UIは元に戻ります。しかし、メインコントローラ上のセカンダリスレッドはまだオンであり、メインスレッドによってMainController上でモーダルコントローラが呼び出された後でも、willRotate関数を呼び出すと、

私はさまざまな記事を読んでいますが、私たちは二次スレッドを単に殺すことはできません。だから誰も私のセカンダリスレッドを殺すし、私の呼び出しフォームに戻る前にクリーンアップを行うコードを介して私を導くことができます.. ?? それはちょっと緊急です...私はすでにそれらを訪問したので、他のスレッドのトピックを指摘してください。

クラッシュを引き起こすことなく、私のセカンダリスレッドをどのように止めるべきかを具体的に知りたいと思います。ありがとう。

-(void)viewDidLoad { 

[super viewDidLoad]; 

workingThread = [[NSThread alloc]initWithTarget:self selector:@selector(parseMainTextFile) object:nil]; 

[workingThread start]; 

[NSThread detachNewThreadSelector:@selector(addLoader) toTarget:self withObject:nil]; 
    //[self performSelectorOnMainThread:@selector(parseMainMatchTextFile) withObject:nil waitUntilDone:NO]; 

} 
+1

[あなたのビューのバックグラウンド読み込み]とは何を意味しますか? UIKitはスレッドセーフではありません(ごくわずかな場合を除いて)。他のスレッドでビューをロードすることは安全ではありません。 –

+0

申し訳ありませんが正しい言葉は私のビューのバックグラウンドの初期化です。 – swapnil

+0

質問を編集しました。ここで作業スレッドは私の二次スレッドです。また、parseMainTextFile:はスレッド起動関数です。このメソッドには、子コントロールを初期化する一連の他のメソッドがあります。シーンが少しはっきりしていることを願っています。 – swapnil

答えて

2

一般に、バックグラウンドスレッドを実行すると、whileループで動作する実行ループがあることを意味します。実行ループを停止させるフラグが必要です。このようにしてスレッドの状態を終了に変換します。

while (mRunLoop && [mLoop runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]); 

これは私のやり方です。さらに、このPostとそのコメントのコメントを読んでください。がんばろう!

+0

Umm..Olegありがとう、しかし、ちょうどシナリオを示すスニペットを投稿できますか?私はそれを十分に理解していませんでした。 – swapnil

+0

これは私のために働く方法です:NSRunLoop * mLoop = [NSRunLoop currentRunLoop];\t \t self.animationTimer = [NSTimer scheduledTimerWithTimeInterval:animationIntervalターゲット:セルフセレクタ:@selector(drawView)userInfo:nil repeats:YES]; \t \t mRunLoop = YES; \t while(![[NSThread currentThread] isCancelled] && mRunLoop && [mLoop runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]); –

+0

umm..まだ混乱があります。ここで何が起きているのか教えてください。 – swapnil

関連する問題