2

これが私の最初の質問ですので、間違えたらすみません!

私のiPhoneプロジェクトでは、実行に時間がかかるスレッドで実行されているメソッドがあります(そのため、スレッドで実行されます)。

[NSThread detachNewThreadSelector:@selector(methodToBeCalledInAThread) toTarget:self withObject:nil];

// ...

-(void)methodToBeCalledInAThread {  
    MyClass *myClass = [[MyClass alloc] init];  
    [myClass setDelegate:self]; 
    [myClass veryIntensiveComputing];   
    [myClass release];
}

私の目標は、このメソッドで進行中の進行状況を、このメソッドを呼び出すViewControllerに通知することです。これが、ViewControllerをクラスのデリゲートとして設定した理由です。

今、高価な方法で私は次のことをします:

if(self.delegate != nil) {
    [self.delegate madeSomeProgress];
}

しかし、残念ながら、これは機能しません。なぜなら、私はバックグラウンドスレッドにいるからです。

メソッドが非同期で実行されている変更をデリゲートに通知するにはどうすればよいですか?

4

1 に答える 1

4

試してみてください[self.delegate performSelectorOnMainThread: @selector(madeSomeProgress) withObject: nil waitUntilDone: YES];...。

詳細については、ドキュメントを参照してください

これにより、メインスレッドで同期的に操作が実行されます。メインスレッドの何もそのセカンダリスレッドで何かを実行しようとしない限り、これはほとんど安全に実行できます。

ただし、メインスレッドがリクエストを処理するまで計算をブロックしたくない場合は、NOを渡して待機しないようにすることができます。その場合、スレッドの同期についても心配する必要があります。メインスレッドはリクエストをすぐに処理しない場合があり、処理する場合は、バックグラウンドスレッドが状態を変更している可能性があります。

スレッドは難しいです。

于 2010-09-01T15:19:34.520 に答える