2011-09-13 13 views
4

私はXMLファイルを読み込んでいるときにNSThreadを使ってviewControllerの内容を読み込むアプリケーションをやっています。NSThreadをキャンセルまたは停止する方法は?

次のように私はそれが行っている:

-(void)viewDidAppear:(BOOL)animated 
{ 
    // Some code... 


    [NSThread detachNewThreadSelector:@selector(loadXML) toTarget:self withObject:nil]; 
    [super viewDidAppear:YES]; 
} 

-(void)loadXML{ 

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

    // Read XML, create objects... 

    [pool release]; 
} 

私の問題は、アプリケーションがクラッシュしていることをやって、私はNSThreadのロード中に別のViewControllerにユーザーが変更された場合NSThreadを停止する方法を知らないということです。

私は成功せず、しかし、次のようにNSThreadをキャンセルまたは終了しようとしました

-(void)viewsDidDisappear:(BOOL)animated{ 
    [NSThread cancel]; 
    // or [NSThread exit]; 
    [super viewDidDisappear:YES]; 
} 

誰が助けることはできますか?ありがとう。

+0

あなたの - (void)viewsDidDisappear:(BOOL)アニメーションメソッドが呼び出されましたか? – Maulik

+0

はい、書くのを忘れました – karse23

答えて

7

新しいスレッドをデタッチすると、これ以上キャンセルしたり、viewDidDisappearなどから終了することはできません。これらのUI固有のメソッドはメインスレッドでのみ実行されるため、終了/キャンセルは明らかに間違っているメインスレッドに適用されます。

代わりの..新しいスレッド方式を切り離すの.hにNSThread変数を宣言してinitWithTarget: selector: object:メソッドを使用して、それを初期化し、/あなたがしたいどこでもいつでもそれを取り消す

+0

あなたは正しく動作します!ありがとう! – karse23

1

[NSThread exit];の方法をNSThreadとすることもできます。

+0

私はこれを試しましたが、これは私にとってはうまくいかず、アプリがクラッシュする=( – karse23

+0

クラッシュログは何ですか? – Maulik

+0

[NSThread exit]を使用するとクラッシュログは表示されません。アプリケーションがスレッドを終了している間に応答を停止します。スレッド停止またはログを取り消す場合は、これをキャッチします:キャッチされない例外 'NsInvalidArgumentException'、理由: ' - [__ NSCFDictionary addSubview:]:インスタンスに送信された認識できないセレクタ... – karse23

0

を使用してそれは、スレッドが正常に終了させた方がよいでしょうそうであれば、その自然な結論に達する。それはあなたが余裕があるあなたの場合のように聞こえる。 UIKitはスレッドセーフではないため、セカンダリスレッドではなく、メインスレッドからユーザーインターフェイスを更新していることを確認してください。あなたが書いた

0

:スレッドが終了するまで を...アプリが応答を停止...

あなたはキャンセルまたは終了のためのスレッドにフラグを設定すると、手動でスレッドが行うことに呼ばれていたものは何でも停止する必要があります。例: ....この例で

- (void) doCalculation{ 
/* Do your calculation here */ 
} 
- (void) calculationThreadEntry{ 
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; NSUInteger counter = 0; 
while ([[NSThread currentThread] isCancelled] == NO){ 

[self doCalculation]; 
    counter++; 
    if (counter >= 1000){ break; 
    } } 
    [pool release]; } 
    application:(UIApplication *)application 
    - (BOOL) 
    didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{ 
    /* Start the thread */ 
    [NSThread detachNewThreadSelector:@selector(calculationThreadEntry) 
    toTarget:self withObject:nil]; 
    // Override point for customization after application launch. [self.window makeKeyAndVisible]; 
    return YES; 
    } 

は、ループが非解除状態にあるスレッドで調整されます。

関連する問題