1

私はObjectiveCとMac開発に不慣れです...アプリでPosixスレッドAPIを使用できるようです。これは推奨される方法ですか?それとも、代わりにミューテックス、条件変数、スレッドに使用する必要があるApple APIですか?

私がiPhone用に開発していることを付け加えておきます。

私がやろうとしていることを正確に追加したいと思います。基本的に、CoreLocationは非同期です...更新を開始するように指示すると、定期的にupdateメソッドが呼び出されます...

私が抱えている問題は、更新が発生するまでブロックする別のスレッドが必要なことです...少なくとも1つのCoreLocation更新が発生するまでメインアプリケーションスレッドをブロックするにはどうすればよいですか?それらはNSConditionVariableですか?:)

4

4 に答える 4

6

スレッドにスタックするさらに簡単な方法は、次の呼び出しを使用することです。

[self performSelectorInBackground:(@selector(myMethod)) withObject:nil];

これにより、実行するための新しいバックグラウンド スレッドが自動的に作成されます。ちなみに、バックグラウンド メソッド内で次のことを行っていることを確認してください。

-(void) myMethod {
   NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
   // code you want to run in background thread;
   [pool drain];
}

これが必要なのは、メイン スレッド以外のスレッドにはデフォルトの自動解放プールが設定されていないためです。

最後に、メイン スレッドのブロックについて言えば、バックグラウンド スレッドから以下を使用してこれを行うことができます。

[self performSelectorOnMainThread:(@selector(myOtherMethod)) withObject:nil waitUntilDone:YES];

オプションの 3 番目のパラメーターは、必要に応じてメイン スレッドを保持します。

それが役立つことを願っています!

于 2009-08-11T17:45:03.433 に答える
2

何をしようとしているのかにもよりますが、私は NSOperation と NSOperationQueue から始めます。これにより、バックグラウンド タスクの引き継ぎが非常に簡単になります。NSOperation の並行性に関する Dave Dribin のブログ投稿もご覧ください。

于 2009-08-11T17:28:23.640 に答える
1

はい、 NSCondition オブジェクトがあり、おそらく、あなたが言及した CoreLocation シナリオに必要なことを正確に実行します。

于 2009-08-11T18:36:53.220 に答える
1

ユーザー インターフェースをハングさせてブロックするのではなく、最初のアップデートを受け取るまで何らかの読み込み画面を表示することをお勧めします。は次のようになります。

- (void)viewDidLoad {
    ...
    [myCLLocationManager beginUpdates];
    [self showLoadingIndicator];
    ....
}

- (void)locationManager:(CLLocationManager *)manager didReceiveUpdates {
    [self hideLoadingIndicator];
    // Additionally load the rest of your UI here, if you haven't already
}

これらのメソッド呼び出しを逐語的に引用しないでください。それが、本質的に問題を解決する方法です。

于 2009-08-11T18:56:26.490 に答える