1

非同期ネットワーク操作を含むいくつかの「サブタスク」に依存する「同期」タスクがありますが、これらはすべて単一のにアクセスする必要がありますNSManagedObjectContext。sのスレッド要件によりNSManagedObjectContext、これらのサブタスクをすべて同じスレッドで実行する必要があります。これらのタスクのいくつかで実行される処理の量のために、私はそれらがバックグラウンドスレッド上にある必要があります。

現時点では、シングルトンSyncEngineオブジェクトの-initメソッドでこれを実行して、新しいスレッドを起動しています。

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

メソッドは次の-initializeSyncThreadようになります。

- (void)initializeSyncThread
{
    self.syncThread = [NSThread currentThread];
    self.managedObjectContext = [(MyAppDelegate *)[UIApplication sharedApplication].delegate createManagedObjectContext];
    NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
    [runLoop run];
}

NSRunLoopこれは、このスレッドを起動する正しい方法ですか?それを行うためのより良い方法はありますか?実行ループは「performSelector」ソースを処理するだけでよく、それ(およびそのスレッド)はプロセスの存続期間中存在する必要があります。

の設定に関してはNSAutoreleasePool、Run Loop Observersを使用して自動解放プールを作成し、実行するたびにそれを排出することでこれを行う必要がありますか?

4

2 に答える 2

0

これがあなたの問題を解決する最も効率的な方法であると100%確信しているわけではありませんが、私はこのようにしています...

callComplete非同期ネットワーク操作は完了するまで (またはタイムアウトするまで) に異なる時間がかかる可能性があるため、インスタンス変数 (この場合は と呼ばれる BOOL )を使用してそれらを追跡します。

ネットワークリクエストを発火するためのコードが開始され、私NSURLConnectionが去って魔法のようにやっているとき、私はこのように呼び出しが完了するのを待ちます。

while(!callComplete && [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]){
    // Here you can perform other checks, like making sure the method isn't running forever (with a timeout variable)
    // Just set callComplete to YES when done
}
于 2010-05-14T10:01:27.330 に答える
0

に関してはNSAutoreleasePool、バックグラウンドで実行されるセレクターの開始時に作成するだけです。次に、実行ループが完了した後 (および呼び出しが完了した後)、通常どおりリリースしてから戻ります。

于 2010-05-14T10:06:20.970 に答える