2

アプリにメインスレッドと補助スレッドがあります。誰もが知っているメインスレッドはUIによって使用されています。セカンダリスレッドを使用して、ビューのバックグラウンドロードを実行します。私はダミーコントローラーと呼ぶメインコントローラーを持っています。そこから、ランドスケープモードのメインコントローラーを呼び出します。

つまり、基本的に私がしなければならないのは、ダミーコントローラーを回転させるときに、メインのランドスケープコントローラーをロードできるようにしたいということです。

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

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

今問題。

ユーザーがダミー->メインから回転しようとしている場合、rotateメソッドはメインビューコントローラーの初期化を開始します。しかし、何らかの理由で、ユーザーは気が変わってメインから回転して戻ります->ダミーが理想的です。UIスレッド(メインの読み取り)が無料であるため、移行はスムーズになります。何が起こるかというと、UIが回転して戻ります。ただし、メインコントローラーのセカンダリスレッドはまだオンになっているため、メインスレッドによってメインコントローラーでdismissモーダルコントローラーが呼び出された後でも、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];

}
4

1 に答える 1

2

一般的に言って、バックグラウンドスレッドを実行する場合は、whileステートメントで機能する実行ループがあることを意味します。実行ループを停止するフラグが必要です。このようにして、スレッドの状態を終了に変換します。

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

これが私のやり方です。さらに、コメントからこの投稿とそのサブ投稿を読んでください。幸運を!

于 2010-12-29T16:09:56.240 に答える